1 / 50

MATLAB 개요와 응용 7 장 MATLAB 프로그래밍

MATLAB 개요와 응용 7 장 MATLAB 프로그래밍. 소속 : 인하대학교 수학과 전공 : 응용수학 ( 수치해석 ) 강사 : 정 신 자. 강의 내용. 관계 연산자와 논리 연산자 조건문 Switch-case 문 루프 (loop) 중첩 루프와 중첩 조건문 break 명령어와 continue 명령어 응용예제. 프로그래밍 개요 . 컴퓨터 프로그램은 원하는 목적을 얻기 위해 작성된 일련의 컴퓨터 명령어들이다 .

Download Presentation

MATLAB 개요와 응용 7 장 MATLAB 프로그래밍

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. MATLAB 개요와 응용7장 MATLAB 프로그래밍 소속 : 인하대학교 수학과 전공 : 응용수학(수치해석) 강사 : 정 신 자

  2. 강의 내용 • 관계 연산자와 논리 연산자 • 조건문 • Switch-case 문 • 루프(loop) • 중첩 루프와 중첩 조건문 • break 명령어와 continue 명령어 • 응용예제 7장 MATLAB 프로그래밍

  3. 프로그래밍 개요 • 컴퓨터 프로그램은 원하는 목적을 얻기 위해 작성된 일련의 컴퓨터 명령어들이다. 예) 우체국에서 소포 요금을 계산할 때, 소포의 중량과 크기, 소포의 내용물, 배송방법(특급, 빠른 우편, 보통 등) 등에 따라 다른 계산식을 사용한다. • 동일한 과정의 명령어 그룹을 반복해서 수행해야 할 경우도 있다. 예) 방정식을 수치적으로 풀 때, 구하는 답의 오차가 어떤 기준보다 작아질 때까지 일련의 계산과정을 반복적으로 수행해야 한다. • MATLAB은 프로그램의 흐름을 제어할 수 있는 여러 도구들을 제공한다. • 조건문(conditional statement)과 switch구조는 상황에 따라 명령어들을 건너뛰거나 특정 그룹의 명령어들을 실행시킬 수 있다. • For루프와 while루프는 어떤 명령어 그룹을 여러 번 반복 수행시킬 수 있다. 7장 MATLAB 프로그래밍

  4. 프로그래밍 개요 • 프로그램의 흐름을 바꾸기 위해서는 프로그램 내에 결정 과정(decision-making process)이 필요하다. 바로 다음 명령을 수행할 것인지, 아니면 하나 또는 그 이상의 명령을 뛰어넘어 다른 명령을 수행할 것인지를 결정해야 한다. 이러한 결정은 관계연산자(relational operator)와 논리연산자(logical operator)를 이용하여 변수들의 값을 비교함으로써 이루어진다. • 함수 파일은 부프로그램(subprogram)으로 프로그래밍에 이용될 수 있다. 프로그램 내에서 함수가 포함된 명령줄(command line)을 만나면 프로그램은 함수에 입력을 제공한 후 그 결과를 기다린다. 함수는 계산을 수행한 후 결과를 “함수 호출” 프로그램에 되돌려 주며, 프로그램은 계속해서 그 다음 명령을 수행하게 된다. 어떻게? 어떤 방법으로? 무엇을 찾을 것인가? 7장 MATLAB 프로그래밍

  5. 알고리즘 • 알고리즘(Algorithm) : 한정된 시간 안에 어떤 일을 수행할 수 있도록 잘 정의된 명령어들을 순서에 맞춰 나열한 것으로, 알고리즘은 제어 구조를 이용하여 명령어들의 실행 순서를 변경할 수 있어야 한다. • 알고리즘의 운영 방법 : • 순차적 실행(Sequential operations) : 순서에 따라 명령을 실행시킴 • 조건부 실행(Conditional operations) : 참과 거짓을 판단할 수 있는 질문의 결과에 따라 다음에 수행할 명령들을 결정함. • 반복 실행(Iterative operations or loops) : 어떤 명령그룹들을 반복해서 실행시킴 7장 MATLAB 프로그래밍

  6. 구조화 프로그래밍 • 구조화 프로그래밍(Structured programming) • 프로그램의 기능들을 서로 분리하여 계층적 모듈들을 사용하여 프로그래밍하는 것으로, MATLAB에서는 함수들의 집합체로 프로그램을 작성할 수 있다. • 구조화 프로그래밍의 장점 • 전반적으로 문제를 먼저 검토하고 나서 세부적인 사항을 다룰 수 있으므로 구조화 프로그램은 작성하기가 쉽다. • 한 개의 응용문제를 위해 작성한 모듈들(함수들)을 다른 응용문제에도 사용할 수 있다. (이것을 reusable code라고 한다) • 각 모듈은 단 하나의 목적을 수행하도록 설계되었으며 따라서 다른 모듈과 분리하여 테스트할 수 있으므로, 구조화 프로그램은 디버깅하기가 쉽다. • 구조화 프로그래밍은 여러 사람들이 각자 모듈을 개발할 수 있으므로 공통 프로그램에 대해 팀을 이뤄 작업할 때 효과적이다. • 모듈에 의미있는 이름을 부여하고 모듈의 목적을 명확히 알 수 있도록 설명을 붙인다면, 구조화 프로그램은 이해하고 수정하기가 쉽다. 7장 MATLAB 프로그래밍

  7. 시작 연산 논리 표현 연산 1 연산 2 종료 흐름도(Flowchart) • 프로그램의 흐름을 실제 프로그래밍 언어를 사용하지 않고 그림과 간단한 글이나 식으로 표시하는 것으로 긴 프로그램을 작성할 때 도움이 된다. 7장 MATLAB 프로그래밍

  8. 관계연산자(Relational operator) • 관계연산자는 두 수를 비교하여 결과가 참인지 거짓인지를 결정한다. 결과가 참이면 1을, 거짓이면 0의 값을 준다. • 관계연산자는 수학식 안에서 산술 연산자처럼 사용될 수 있으며, 결과는 배열의 주소 지정에 사용되거나 MATLAB의 다른 명령어들과 함께 사용되어 프로그램의 흐름을 제어할 수 있다. 7장 MATLAB 프로그래밍

  9. >> bool = 4 < 10% 4가 10보다 작으므로 1을 bool에 할당한다. bool = 1 >> (3 > 2) + (9 < 5) + (12/2==3*2) % 1+0+1=2 ans = 2 >> x=randperm(5), y=randperm(5) x = 1 2 3 4 5 y = 1 4 5 3 2 >> z=x>=y% z = (x >= y)와 같다 z = 1 0 0 1 1 >> a =x ==y% a=(x==y), 원소별로 x 와 y의 값이 같으면 참이다. a= 1 0 0 00 >> b =x ~=y% 원소별로 x 와 y의 값이 같지 않으면 참이다. a= 01111 관계연산자 • 크기가 같은 두 배열을 비교하면, 원소 대 원소 별로 비교하여각 원소의 비교 결과에 따라 0과 1을 갖는같은 크기의 논리배열(logical arry)을 출력한다. 스칼라를 배열과 비교하면, 스칼라는 배열의 모든 요소와 비교되어 비교 결과에 따라 0과 1을 갖는 논리배열을 출력한다. 7장 MATLAB 프로그래밍

  10. 관계연산자 >> x=randperm(5), y=randperm(5) x = 5 3 4 2 1 y = 2 4 5 3 1 >> z = x – y > 0% 산술연산을 먼저 한 후 각 원소를 0과 비교 x = 1 0 0 0 0 >> z=x>=y% z = (x >= y)와 같다 z = 1 0 0 0 1 >> z=x(x<y) z = 3 4 2 >> X = [8 1 6; 3 5 7; 4 9 2]; >> B = X >= 4 B = 1 0 1 0 1 1 1 1 0 7장 MATLAB 프로그래밍

  11. 관계연산자 >> A=[ 2 7 6; 4 -2 5]; B = [2 8 0.5; 6 -1 5]; >> C1 = A > B C1 = 0 0 1 0 0 0 >> C2 = A <= B C2 = 1 1 0 1 1 1 >> C3 = A == B C3 = 1 0 0 0 0 1 >> C4 = A ~= B C4 = 01 1 1 1 0 >> C5 = A – ( B > 4 ) C5 = 266 3-35 7장 MATLAB 프로그래밍

  12. >> v = [7 12 8 3 15 24 6]; >> bool = v <= 8 % 벡터 v의 원소들이 8이하인지 비교한다. bool = 1 0 1 1 0 0 1 >> w = v(bool) % 논리벡터를 이용한 벡터 v의 원소 추출 w = 7 8 3 6 >> w = v( v <=8 ) w = 7 8 3 6 >> n = [1 0 1 1 0 0 1]; >> v(n) ??? Subscript indices must either be real positive integers or logicals >> v( [1 1 4 5] ) % 일반적인 배열의 주소 지정 ans = 7 7 3 15 n은 논리벡터가 아니므로 주소 지정에 사용될 수 없다. 또헌 벡터n에 0으로 인해 존재하지않는 주소가된다. 관계연산자 • 관계연산의 결과로 얻어진 논리벡터를 다른 벡터 v의 주소 지정에 사용하면, 논리벡터의 원소가 1인 위치에 해당하는 벡터 v의 원소만 추출해 준다. 7장 MATLAB 프로그래밍

  13. >> 3+4<16/2 % 더하기와 나누기가 먼저 실행되므로 “7 < 8”의 결과는 1임 ans = 1 >> A = [ 2 3 0; 1 0 4]; >> A = A + (A==0)*eps;% A의 원소중에 0이 있으면, 0 대신 eps로 대체함 >> format long e, A A = 2.000000000000000e+000 3.000000000000000e+000 2.220446049250313e-016 1.000000000000000e+000 2.220446049250313e-016 4.000000000000000e+000 >> eps % eps : floating point relative accuracy(ε) ans = 2.2204e-016 관계연산자의 응용 • 논리벡터가 산술연산에 사용되면, 논리벡터는 먼저 수치벡터로 변환된다. • 산술연산자(+, -, *, /, \ )는 관계연산자보다 연산 순위가 우선이다. 예) z= 5 > 2 + 7 vs. z = 5 > (2 + 7) • 분모가 0이 되어 계산을 못 하게 되는 에러를 막기 위한 기법으로 관계연산자를 이용할 수 있다*. 7장 MATLAB 프로그래밍

  14. >> x = -10 : 10 ; % 벡터 x에 0이 포함됨 >> y = sin(x) ./x ; grid on Warning: Divide by zero. y = Columns 1 through 8 -0.0544 0.0458 0.1237 0.0939 -0.0466 …… %x(11)=NaN Columns 17 through 21 -0.0466 0.0939 0.1237 0.0458 -0.0544 >> plot(x, y) • “Divide by zero” 의 수정 >> x = -10 : 10; >> x = x + (x==0)*eps ; %분모가 0이되는부분 >> y = sin(x) ./x >> plot(x, y); grid on 관계연산자의 응용 • sine 함수 의 그래프 그리기 7장 MATLAB 프로그래밍

  15. 논리연산자(Logical operator) • MATLAB의 논리 연산자 (0은 거짓, 0이 아닌 숫자는 모두 참으로 본다) 7장 MATLAB 프로그래밍

  16. 같은 우선순위를 가진 연산자가 둘 이상 있는 경우, 왼쪽에서 오른쪽 순서로 연산을 수행한다. 논리연산자 • MATLAB버전 6 이전에는 우선순위에 변동이 있으므로 괄호를 사용하는 것이 안전하다. • 연산자의 우선 순위 1순위 : 괄호(괄호가 중첩되어 있는 경우, 가장 안쪽 괄호가 최우선 순위) 2순위 : 거듭제곱(^) 3순위 : Logical NOT(~) 4순위 : 곱하기, 나누기 5순위 : 더하기, 빼기 6순위 : 관계연산자( >, <, >=, <=, ==, ~= ) 7순위 : 논리연산자 AND(&) 8순위 : 논리연산자 OR( | ) 7장 MATLAB 프로그래밍

  17. >> x=[ 1 0 -2]; y = [0 0 9]; A=[x; y]; >> find(x) ans = 1 3 >> find(x & y) ans = 3 >> [m, n, v] = find(A) m = 1 n = 1 v = 1 1 3 -2 2 3 9 공간 제약으로 실제와 다르게 이렇게 표현함 A(1,1) → 1 A(1,3) → -2 A(2,3) → 9 내장 논리함수 find • find명령어는 주어진 논리가 참(true)이 되게 하는 벡터나 배열의 원소 주소를 돌려준다. 입력인자는 벡터,배열, 또는 논리 표현식이다. find(A)벡터나 배열인 A에서 0이 아닌 원소의 주소를 돌려준다. k=find(A)벡터나 배열인 A를 하나의 열(column)벡터로 생각하여 0이 아닌 원소의 주소를 돌려준다. [i, j, v]=find(A)배열 A에서 0이 아닌 원소의 주소 (i, j)와 해당 값을 벡터 v로 돌려준다. 7장 MATLAB 프로그래밍

  18. >> A=[ 8 0 -2; 0 3 0; -4 0 9]; >> [m, n, v] = find(A > 3) m = 1 3 n = 1 3 v = 1 1 >> find(0<A & A < 9) ans = 1 5 내장 논리함수 find • find(논리표현식)논리 표현식이 참(true)을 만족하게 하는 배열의 원소 주소를 돌려준다. 7장 MATLAB 프로그래밍

  19. >> T=[24 25 24 28 30 32 29 26 23 33 31]; >> T30 = T >= 30; ans = 0 0 0 0 1 1 0 0 0 1 1 >> T30Days = sum(T30) T30No = 4 >> T25to28 = 25 <= T & T <= 28 T25to28 = 0 1 0 1 0 0 0 1 0 0 0 >> T25to28Days = sum(T25to28) T25to28Days = 3 예제 온도 데이터의 분석 • 대전의 7월 중순의 낮 최고 기온이 다음 표와 같다. 다음을 구하라. 1) 낮 최고기온이 30° 이상인 날은 모두 며칠인가? 2) 낮 최고기온이 25°~28°에 해당하는 날은 모두 며칠인가? 3) 낮 최고기온이 28°~32°에 해당하는 날짜는 언제입니까? 7장 MATLAB 프로그래밍

  20. 예제 3) 낮 최고기온이 28°~32°에 해당하는 날짜는 언제입니까? >>T28to32 = 28 <= T & T <= 32 T28to32 = 0 0 0 1 1 1 1 0 0 1 1 >>Day=11:21; >>Day_T28to32=Day(T28to32) Day_T28to32= 14 15 16 17 21 7장 MATLAB 프로그래밍

  21. 명령어 ………… ………… if 조건식 …… …… end …… …… MATLAB 프로그램 거짓 if 문 참 MATLAB 명령어 그룹 명령어 그룹 명령어 MATLAB 프로그램 조건문(Conditional statements) • 조건문은 MATLAB이 조건문 다음에 오는 명령어 그룹을 실행시킬 지에 대한 결정을 하도록 하는 명령어이다. • 조건문에는 조건식이 기술된다. 이 조건식이 참이면 조건문 다음의 명령어 그룹들이 실행되며, 거짓이면 명령어 그룹들을 실행하지 않고 건너뛰게 된다. • if – end구조 7장 MATLAB 프로그래밍

  22. if x>=0 & y>= 0, z=sqrt(x)+y, w=log(x)–log(y), end 와 같이 한 줄로 쓸 수도 있다. if 문 사용 예 • if 조건문 사용 예 : if x < 10^(-5) if n == 10 if x ~= 0 if (n > 10) & ( x > 100) • x ≥ 0일 때 √x 를 계산하라. if x >=0 y = sqrt(x) end • x ≥ 0, y ≥ 0일 때 z=√x + √y 와 w=log x – log y를 계산하라. if x >=0 & y >= 0 z = sqrt(x) + y w= log(x) – log(y) end if x >=0, y = sqrt(x), end 와 같이 한 줄로 쓸 수도 있다. 7장 MATLAB 프로그래밍

  23. n = input(‘홀수, 짝수를 판별할 숫자를 입력하시오 : ’); if rem(n, 2) == 0 fprintf( ‘%d는(은) 짝수입니다.\n’, n); end if rem(n, 2) ~= 0 fprintf( ‘%d는(은) 홀수입니다.\n’, n); end • 벡터의 평균값을 구하는 프로그램 >> ave 데이터를 입력하시오 : [1:10] 평균값은 5.50입니다. >> ave 데이터를 입력하시오 : ??? Error using ==> ave 데이터가 입력되지 않았습니다. x = input( '데이터를 입력하시오 : '); n=length(x); if (~n) error( '데이터가 입력되지 않았습니다.') end avg = sum(x)/n; fprintf( '평균값은 %.2f입니다.\n', avg) if 문 사용 예 • 사용자가 입력한 숫자의 홀, 짝수를 판정하는 프로그램 7장 MATLAB 프로그래밍

  24. 파일명 : workerpay t=input('근무한 시간 수를 입력하시오: '); h=input('시간당 임금을 달러로 입력하시오: '); Pay=t*h; if t>40 Pay=Pay+(t-40)*0.5*h; end fprintf('노동자의 임금은 $%5.2f입니다.\n', Pay) >> Workerpay 근무한 시간 수를 입력하시오: 35 시간당 임금을 달러로 입력하시오: 8 노동자의 임금은 $280.00입니다. 예제]노동자의 급료 계산 • 어떤 노동자가 기준 노동시간인 40시간까지는 자신의 시간당 임금에 따라 급료를 받으며, 초과시간에 대해서는 50%를 더 받는다. 이 노동자의 급료를 계산하는 프로그램을 스크립트 파일로 작성하라. 프로그램 실행시 사용자는 근로시간과 시간당 임금을 입력하게 되며, 프로그램은 급료를 출력한다. 1. 시간 t<=40 : 시간*시급=월급 2. 시간 t>40 : 40시간까진*시급 40시간초과*1.5*시급 <정리하면 : 일한시간t*시급 + 추가시간(t-40)*0.5*시급 7장 MATLAB 프로그래밍

  25. ………… ………… if 조건 식 …… …… else …… …… end …… …… 명령어 MATLAB 프로그램 거짓 if 문 MATLAB 명령어 그룹 1 참 명령 그룹 1 명령 그룹 2 MATLAB 명령어 그룹 2 명령어 MATLAB 프로그램 if – else – end 구조 • 조건판단에 따라 실행해야 할 선택사항이 서로 상반된 두 가지일 경우 if-else-end 구조를 사용한다. 예를 들어 어떤 수의 짝수, 홀수 여부에 따라 다른 명령을 수행해야 할 경우, 짝수에 따른 명령과 홀수에 따른 명령은 서로 독립적이므로 두 가지 조건문이 필요하게 된다. 7장 MATLAB 프로그래밍

  26. n = input('홀수, 짝수를 판별할 숫자를 입력하시오 : '); if rem(n, 2) == 0 fprintf('%d는(은) 짝수입니다.\n', n); else fprintf('%d는(은) 홀수입니다.\n', n); end • 2 kg 이하 소포의 등기배달 요금은 4,000원, 보통배달 요금은 2,700원이다. • 배달 종류에 따라 소포 세 개의 요금을 계산하는 프로그램을 작성하라. n = input('소포의 개수를 입력하시오 : '); type = input('소포의 배달 종류를 선택하시오(등기=1, 보통=0) :'); if type % type==1 , switch문으로도 가능하다 charge=4000*n; else charge=2700*n; end fprintf('총 배달 요금은 %d입니다.\n', charge); if – else – end 사용 예 • 사용자가 입력한 숫자의 홀, 짝수를 판정하는 프로그램 7장 MATLAB 프로그래밍

  27. ………… ………… if 조건식 …… …… elseif 조건식 …… …… else …… …… end …… …… MATLAB 프로그램 명령어 거짓 if 문 MATLAB 명령어 그룹 1 참 거짓 elseif 문 MATLAB 명령어 그룹 2 참 명령 그룹 1 명령 그룹 2 명령 그룹 3 MATLAB 명령어 그룹 3 명령어 MATLAB 프로그램 if – elseif – else - end 구조 • 서로 상반되는 조건이 여러 개일 때 사용하며, 조건의 개수에 따라 elseif를 추가하면 된다. else 문은 옵션으로 꼭 필요하지는 않다. 7장 MATLAB 프로그래밍

  28. function x = root2(a, b, c) % root2는 2차 방정식의 근을 구한다. D = b^2 – 4*a*c; tmp1 = -b/(2*a); if D==0 x = tmp1; elseif D > 0 tmp2 = sqrt(D)/(2*a); x(1)=tmp1+tmp2; x(2)=tmp1–tmp2; else tmp2 = sqrt(-1*D)/(2*a); x(1)=tmp1+tmp2*i; x(2)=tmp1-tmp2*i; end >> root2(3, -9, 4) ans = 2.4574 0.5426 >> root2(5, -14, 13) ans = 1.4000 + 0.8000i 1.4000 - 0.8000i >> roots([5, -14, 13])% 내장함수 이용 ans = 1.4000 + 0.8000i 1.4000 - 0.8000i >> • roots(C) : 다항식 anxn+an-1xn-1+…+a1x+a0=0의 계수 C=[an an-1 … a1a0]를 입력인자로 받아 해를 계산하여 벡터로 돌려준다. if - elseif - else - end 사용 예 • 2차방정식 ax2+bx+c=0의 근을 구하는 함수 프로그램을 작성하고, 3x2–9x+4 =0과 5x2–14x+13=0의 해를 각각 구하라. 7장 MATLAB 프로그래밍

  29. 명령어 ………… switch 표현식 case 값1 …… …… case 값2 …… …… otherwise …… …… end ………… MATLAB 프로그램 switch 문 값1 MATLAB 명령어 그룹 1 명령 그룹 1 값2 명령 그룹 2 MATLAB 명령어 그룹 2 그 외 명령 그룹 n MATLAB 명령어 그룹 n 명령어 MATLAB 프로그램 switch-case 문 • switch – case문은 switch 다음의 표현식의 값에 따라 여러 명령그룹들중에서 한 그룹을 골라 실행시킬 때 사용한다. switch-case문은 if문을 사용하여 똑같이 실행시킬 수 있지만, switch문이 프로그램을 이해하기가 더 쉽다. • switch문의 구조 7장 MATLAB 프로그래밍

  30. route = input('원하는 노선을 선택하세요 : '); switch route case 1 fare = 1000; case 2 fare = 1100; case {3, 4, 5} fare = 1200; case 2 fare = 1300; otherwise disp( [int2str(route), '번은 없는 노선입니다.'] ) fare = 0; end if fare fprintf('%d번 노선 요금은 %d원입니다.\n', route, fare) end • switch다음의 표현식은 스칼라나 문자열, 값이 미리 정의된 변수나 정수 결과를 갖는 수학식이 될 수 있다. • route값이 2이면 case 2에 해당하는 명령어 그룹이 실행된다. 만일 case 2가 한 개 이상인 경우에는 처음 만나는 case문만 실행된다. • case 문은 2개 이상의 값을 가질 수 있으며, 이 경우 벡터 표시와 달리 ‘{ }’ 표시를 사용한다. switch-case문의 사용 방법 • 다음 예제를 통해 switch-case문의 사용방법에 대해 알아보자. 7장 MATLAB 프로그래밍

  31. unit = input('변환할 현재 단위는[in/ft/m/cm] ? : ', 's'); x= input('현재 길이는? : '); switch unit case {'in', 'inch'} lcm = x * 2.54; case {'ft', 'feet'} lcm = x * 2.54*12; case {'m', 'meter'} lcm = x * 100; case {'cm', 'centimeter'} lcm = x; otherwise disp( ['unknown unit : ', unit] ) lcm = NaN; end fprintf('%d %s는 %d cm입니다.\n', x, unit, lcm) switch-case문의 사용 예 • 주어진 단위의 길이를 cm 단위로 변환하는 프로그램을 작성해보자. page26의 if문을 switch문 으로 실행해보라. 7장 MATLAB 프로그래밍

  32. 명령어 거짓 k ≤ 최종값 • Loop의 인덱스 변수 k는 아무 변수 이름이나 상관없지만, 주로 i, j, k, m, n등이 사용된다. MATLAB에서는 i, j가 복소수 표현에 사용되므로 복소수를 사용할 때는 사용하지 않도록 한다. • 처음 실행할 때 k=f이며 명령어 그룹을 실행한 후 두 번째 실행에서는 k=f+s이 된다. k가 최종값 t를 초과하게 되면 명령어 그룹을 실행하지 않고 end 다음의 명령어로 넘어간다. 예) k=1:2:4일 때 루프는 k=1, 3에 대해 2번 실행된다. 참 명령 그룹 k 값 수정 명령 그룹 n Loop : for-end 루프 • 루프는 명령어 그룹을 어떤 횟수만큼 반복 수행하며, 매회 반복시 적어도 1개 이상의 변수가 루프 내에서 새 값을 할당받는다. 루프에는 반복횟수가 지정된 for-end 반복(루프)문과 지정 조건이 만족될 때까지 반복되는 while-end 반복(루프)문 있다. • for-end loop for k = f : s: t 명령어 그룹 end 7장 MATLAB 프로그래밍

  33. Loop : for-end loop for k = f : s: t 명령어 그룹 end • 증감값 s가 1과 같으면, 생략해도 된다. 예) for m=1:4 ↔ for m=1:1:4 • 증감값 s는 음수가 될 수 있다. 예) k=8:-3:1은 k=8, 5, 3으로 세 번 반복하게 된다. • 시작값인 vi가 최종값인 vf와 같으면, 단 한번만 실행하게 된다. • f > t와 s > 0, 또는 f < t와 s < 0이면 루프는 실행되지 않으며, f=t이면 1번 실행된다. • 루프 인덱스 k는 f 부터 시작해서 루프를 돌 때마다 s씩 증가하며, 그 때마다 최종값 t보다 큰 지 검사해서 k가 t보다 크면 루프를 종료한다. 마지막으로 실행할 때의k값은 t와 같거나 t보다 작다. • for 문에서 k 값에 벡터로 지정된 특정 값을 할당할 수도 있다. 예) for k=[5 3 8 -2 4], disp(k), end • k 값이 루프 내에서 다시 정의되어서는 안 된다. • 루프가 끝나면, 루프 인덱스 변수 k의 값은 마지막으로 할당받은 값이다. for 문에서 최종값과 비교할 때의 값이 아니라는 점에 주의하라. 7장 MATLAB 프로그래밍

  34. for k=1: 3: 10 x = k^2 end >> for k=1:3:10, x=k^2, end x = 1 x = 16 x = 49 x = 100 for-end 루프의 사용 예 1 • 1, 4, 7, 10의 네 수의 제곱값을 차례대로 구하여 출력하라. 7장 MATLAB 프로그래밍

  35. N=input('최종 숫자를 입력하시오 : '); sum = 0; product = 1; for i=1: 2: N sum = sum + i; product = product * i; end fprintf('1부터 %d까지의 모든 홀수들의 합은 %d 이다.\n', N, sum) fprintf('1부터 %d까지의 모든 홀수들의 곱은 %d 이다.\n', N, product) fprintf('마지막으로 더해진 홀수는 %d 이다.\n', i) 예를 들어 N=6인 경우, i는 1부터 2씩 증가하므로 세 번 루프를 돌며, i는 각 루프에서 1, 3, 5의 값을 갖는다. i=7은 최종값 6을 초과하므로 i=5가 최종값이 된다. for-end 루프의 사용 예 2 • 1부터 사용자가 입력한 N 까지의 모든 홀수들의 합과 곱을 구하는 프로그램을 작성하라. 7장 MATLAB 프로그래밍

  36. >> facto 계승(factorial)을 구할 수를 입력하시오 : 5 5! = 120 for-end 루프의 사용 예 3 N=input('계승(factorial)을 구할 수를 입력하시오 : '); if (N >=0 ) f = 1; for i=1:N f = f*i; end fprintf('%d! = %d\n', N, f); else fprintf('음수 %d을(를) 입력했습니다. 양수를 입력하세요.\n', N) end • 사용자가 입력한 수 N의 계승(factorial)을 계산하는 프로그램을 작성하라. 7장 MATLAB 프로그래밍

  37. forx=[1 3 5 7 9] y = sqrt(x); end x=[1 3 5 7 9] y = sqrt(x) vs. • for명령어에서 인덱스에 배열이 주어진 경우, 열벡터의 원소가 모두 수행될 때까지 열벡터가 순서대로 인덱스 변수에 대입되어 루프를 반복한다. 명령창에서의 실행결과 forn=A fprintf('n=%d, ', n) x=(n(3)-n(2))*n(1); fprintf('x=%d\n', x) end n=2, n=8, n=9, x=2 n=4, n=5, n=8, x=12 n=6, n=7, n=11, x=24 for-end 루프 사용 예 4 • for-end 루프를 사용한 결과와 원소별 연산을 사용한 결과가 같은 경우가 있는데, 일반적으로 원소별 연산이 루프보다 더 빠르며 두 방법 모두 사용 가능한 경우라면 원소별 원소 연산방법이 더 바람직하다. • 예제 for x=1:2:9 y = sqrt(x); end 7장 MATLAB 프로그래밍

  38. loop=1; for i=[2.1 4.3 7.5 -6.8] fprintf('loop No =%d, i=%4.1f\n', loop, i) loop=loop+1; end 실행결과 loop No =1, i= 2.1 loop No =2, i= 4.3 loop No =3, i= 7.5 loop No =4, i=-6.8 for-end 루프 사용 예 5 • for 명령어의 루프 인덱스 변수에 실수도 사용될 수 있다. 7장 MATLAB 프로그래밍

  39. (a) 루프를 반복할 때마다 급수의 각 항을 계산하고 이전 항들의 합에 더한다. n=input('항의 개수를 입력하시오: '); s=0; fork=1:n s=s+(-1)^k*k/2^k; end fprintf('급수의 합은 %f 이다.\n', s) >> Exp7_4a 항의 개수를 입력하시오: 4 급수의 합은-0.125000 이다. >> Exp7_4a 항의 개수를 입력하시오: 20 급수의 합은-0.222216 이다. 예제] 급수의 합 a) for-end루프를 이용하여 급수의 첫 n항의 합 을 계산하는 프로그램을 작성하고, n=4와 n=20에 대해 합을 구하라. b) Taylor 급수를 이용하여 sin(x)를 계산하는 사용자정의 함수 파일을 작성하라. 함수 이름과 인자는 y=Tsin(x,n)으로 한다. 입력인자는 각도(°)인 x와 급수의 항의 개수인 n이다. 이 함수로 항의 개수가 3과 7일 때 sin(150°)를 계산하라. 7장 MATLAB 프로그래밍

  40. (b) Taylor 공식의 n개의 항을 더하여 sin(x)를 계산하는 사용자정의 함수 파일. 첫 번째 항은 k=0에 해당하므로, 마지막 루프 인덱스는 k=n-1이 되어야 n개의 항을 더한 셈이 된다. 명령창 function y = Tsin(x, n) % Tsin 은 Taylor 공식에 의해 sin을 계산한다. % 입력인자 : % x는 각도 % n은 항의 개수 xr = x*pi/180; y = 0; fork= 0: n-1 y = y + (-1)^k*xr^(2*k+1)/factorial(2*k+1); end >> Tsin(150, 3) ans = 0.6523 >> Tsin(150, 7) ans = 0.5000 예제 (b) 7장 MATLAB 프로그래밍

  41. V=[5, 17, -3, 8, 0, -7, 12, 15, 20, -6, 6, 4, -2, 16]; n=length(V); for k=1:n if V(k)>0 & ( rem(V(k), 3)==0 | rem(V(k), 5)==0 ) V(k)=2*V(k); elseif V(k) < 0 & V(k) > -5 V(k)=V(k)^3; end end V for-end루프에서 반복횟수는 벡터의 원소 개수와 같다. 매회 반복할 때마다 조건문에서 한 원소씩 체크한다. 원소가 문제의 조건을 만족하면, 새로 계산한 값으로 원소를 대체한다. >> Exp7_5 V = 10 17 -27 8 0 -7 24 30 40 -6 12 4 -8 16 예제] 벡터 원소의 수정 • 벡터 V=[5, 17, -3, 8, 0, -7, 12, 15, 20, -6, 6, 4, -2, 16]의 원소 중에서 양수이면서 3이나 5, 또는 3과 5로 나누어 떨어지는 원소는 2를 곱하고, 음수이면서 -5보다 큰 원소는 세제곱을 하는 프로그램을 스크립트 파일로 작성하라. 7장 MATLAB 프로그래밍

  42. 명령어 ………… ………… while 조건식 …… …… end ………… MATLAB 프로그램 거짓 조건식 참 명령어 그룹 명령 그룹 MATLAB 프로그램 • while의 조건식이 만족(참)되면, while과 end 사이의 명령어 그룹을 수행시킨 후 조건식으로 돌아가서 조건식의 만족여부를 다시 체크한다. 조건식이 만족되지 않으면(거짓), end로 건너뛰어 루프를 종료한다. 명령 그룹 n while-end 루프 • while-end 루프는 반복실행이 필요하지만 반복횟수를 미리 모르는 경우에 사용된다. 따라서 while 루프에서는 루프가 시작될 때 반복회수가 지정되지 않는 대신 while 문의 조건식이 만족될 때까지 루프가 반복된다. • while-end 루프 구조 7장 MATLAB 프로그래밍

  43. 명령어 창 실행 m = 2 m = 4 m = 8 m=1; while m <= 7 m = 2*m end while-end 루프 • while-end 루프가 정상적으로 수행되기 위해서는 • while의 조건식은 적어도 하나의 변수를 반드시 포함해야 한다. • 처음으로 while 명령어를 수행할 때 조건식에 포함된 변수는 while 명령어 이전에 미리 값을 할당받은 상태이어야 한다. • 조건식의 변수들 중에서 적어도 하나는 while과 end 사이의 명령어에서 새로운 값을 할당받아서 while 명령어의 조건식이 거짓이 되도록 만들어야 한다. 그렇지 않으면, 루프는 조건식을 거짓으로 만들수가 없으므로 무한 루프를 돌게 되어 루프를 빠져 나올 수 없게 된다. • while 루프의 적용 예 7장 MATLAB 프로그래밍

  44. m=8; while m ~= 0 m = m – 3; end m이 8, 5, 2, -1, … 과 같이 변하게 되어 정확히 0과 같은 값을 갖지 못하므로 조건식을 거짓으로 만들 수 없다. 따라서 무한 루프를 돌게 된다. • while 루프는 어떤 조건이 만족되는 동안 명령어 그룹을 반복 수행하고자 할 때 주로 사용된다. 일반적으로 while 루프를 for 루프로 수행할 수 있지만, 이런 경우에는 for 루프로 구현하기가 좀 더 까다로운 경우가 많다. n=1; while n ~= 5 disp(n) n=n+1; end for n=1:4 disp(n) end while-end 루프 • 무한 루프의 예 : 7장 MATLAB 프로그래밍

  45. 1부터 N까지의 정수의 합을 구하는 프로그램 N=100; sum = 0; for i = 1 : N sum = sum + i; end sum N=100; sum = 0; k = 1; while k <= N sum = sum + k; k = k + 1; end sum • n! ≤ 100 을 만족하는 가장 큰 정수 n을 구하는 프로그램을 작성하라. n=1; while prod(1:n) <= 100 n = n + 1; end n = n - 1 while 루프와 for 루프 While문 for문 벡터합 N=input(‘N=‘); i=1:N; sum(i) 7장 MATLAB 프로그래밍

  46. x=input('x를 입력하시오 : '); n=1; an=1; S=an; while abs(an) >= 0.0001 & n <= 30 an=x^n/factorial(n); S=S+an; n=n+1; end if n >= 30, disp('30개보다 많은 항이 필요하다.') else fprintf('exp(%f) = %f', x, S) fprintf('\n사용된 항의 개수는 %i 개이다.\n', n) end >> expox x를 입력하시오 : 2 exp(2.000000) = 7.389046 사용된 항의 개수는 12 개이다. >> expox x를 입력하시오 : 21 30개보다 많은 항이 필요하다. 예제] 함수의 Taylor 급수 표현 Taylor 급수를 이용하여 f(x)=ex =를 계산하는 스크립트 파일을 작성하라. 더할 항의 절대값이 0.0001보다 작으면 이 항을 무시하고 이전 항까지의 합을 구한다. while-end루프를 사용하되, 반복횟수는 30으로 제한한다. 30 번째 반복에서 더할 항이 0.0001보다 작아지지 않으면, 루프를 중지하고 30 개 이상의 항이 필요하다는 메시지를 출력하라. 이 프로그램을 이용하여 e2, e-4, e21을 계산하라. 7장 MATLAB 프로그래밍

  47. for k=1:n for h=1:m …… …… end …… end ………… 예) for k=1:3 for h=1:4 명령어 그룹 end end 중첩(된) 루프 루프 • k=1로 시작하여 중첩 루프를 h=1, 2, 3, 4에 대해 4번 실행한다. 다음, k=2에서 중첩 루프는 다시 h=1, 2, 3, 4로 4번 실행한다. 결국 모두 3 x 4 = 12번 명령어 그룹을 실행한다. 중첩 루프와 중첩 조건문 • 루프와 조건문은 또 다른 루프나 조건문 속에 중첩될 수 있으며, 중첩될 수 있는 루프와 조건문의 수에는 제한이 없다. 그러나 if, case, for, while 문 각각에 해당하는 end 문을 잊지 않도록 해야 한다. 7장 MATLAB 프로그래밍

  48. 첫째 루프의 인덱스 변수 k는 행의 주소이며, 둘째 루프의 인덱스 변수 h는 열의 주소이다. n=input('행의 개수를 입력하시오: '); m=input('열의 개수를 입력하시오: '); A=[]; for k=1:n %행원소 for h=1:m %열원소 if k==1 A(k, h)=h; elseif h==1 A(k, h)=k; else A(k, h)=A(k, h-1) + A(k-1, h); end end end A >> Chap7_exp7 행의 개수를 입력하시오: 4 열의 개수를 입력하시오: 5 A = 1 2 3 4 5 2 4 7 11 16 3 7 14 25 41 4 11 25 50 91 예제] 루프에 의한 행렬 생성 • 다음 조건의 원소들을갖는 n×m 행렬을 생성하는 스크립트 파일을 작성하라. 첫째 행의 원소는 해당 원소가 속한열의 번호와 같다. 첫째 열의 원소들은 해당 원소의행의 번호와 같다. 나머지 원소들은 자기 바로 위의 원소와 자기 왼쪽 원소를 더한 값과 같다. n과 m의 값은 프로그램이 실행될 때입력되도록작성한다. 7장 MATLAB 프로그래밍

  49. break와 continue • break명령어 • break명령이 for와 while루프 안에 있으면, 루프의 실행을 즉시 중지하고 루프 밖의 다음 명령어로 넘어간다. 즉, break는 어떤 조건이 만족될 때 루프를 빠져나가기 위한 수단을 제공한다. 예) 루프의 횟수가 정해진 값을 초과하거나 수치계산에서 오차가 정해진 값보다 작아지면 루프를 종료한다. • break명령어가 중첩된 루프내에 있다면, break가 포함된 루프만 중지된다. • break명령어가 스크립트 파일이나 함수 파일에서 for루프나 while루프 밖에 있다면, 해당 위치에서스크립트 파일이나 함수 파일의 실행을 종료한다. 예) 함수 파일로 전달된 데이터가 원하는 것과 일치하지 않는 경우, break 명령어로 함수 파일의 실행을 중지시킨다. • continue명령어 • continue 명령어가 for와 while의 루프 안에서 사용되면, 현재 수행중인 반복과정을 중지하고 루프의 다음 반복과정으로 넘어간다. • MATLAB이 continue 명령어를 만나게 되면, 루프의 나머지 명령들을 실행하지 않고 루프의 end명령어로 건너뛴 후, 다시 루프를 계속 반복한다. 7장 MATLAB 프로그래밍

  50. 사용자가 어떤 수를 입력하면, 1부터 그 수까지 센 후 • 다시 반복회수를 묻는 프로그램을 작성하라. (0을 입력하면 프로그램은 종료된다.) >> whileloop 반복 회수를 입력하시오( < 100) : 5 --------------------- 번호 = 5 5번 반복하였습니다. --------------------- 반복 회수를 입력하시오( < 100) : 0 예제 while1 n = input('반복 회수를 입력하시오( < 100) : '); fprintf('---------------------\n'), fprintf('번호 = ') fprintf('\n%d번 반복하였습니다.\n', n) fprintf('---------------------\n\n') end ifn <= 0 fprintf('\n'), break; end for i =1 : n fprintf( '%2d' , i) if i < n,pause(0.6),fprintf('\b\b'),end end 7장 MATLAB 프로그래밍

More Related