900 likes | 2.31k Views
MATLAB 개요와 응용 7 장 MATLAB 프로그래밍. 강의 내용. 관계 연산자와 논리 연산자 조건문 Switch-case 문 루프 (loop) 중첩 루프와 중첩 조건문 break 명령어와 continue 명령어 응용예제. 프로그래밍 개요 (1/2). 컴퓨터 프로그램은 원하는 목적을 얻기 위해 작성된 일련의 컴퓨터 명령어들이다 . 간단한 프로그램에서는 순차적으로 명령어가 수행되지만 , 좀 더 정교한 프로그램에서는 입력된 변수의 값이나 상태에 따라 수행될 명령어가 결정된다 .
E N D
강의 내용 • 관계 연산자와 논리 연산자 • 조건문 • Switch-case 문 • 루프(loop) • 중첩 루프와 중첩 조건문 • break 명령어와 continue 명령어 • 응용예제 7장 MATLAB 프로그래밍
프로그래밍 개요 (1/2) • 컴퓨터 프로그램은 원하는 목적을 얻기 위해 작성된 일련의 컴퓨터 명령어들이다. 간단한 프로그램에서는 순차적으로 명령어가 수행되지만, 좀 더 정교한 프로그램에서는 입력된 변수의 값이나 상태에 따라 수행될 명령어가 결정된다. 예) 우체국에서 소포 요금을 계산할 때, 소포의 중량과 크기, 소포의 내용물, 배송방법(특급, 빠른 우편, 보통 등) 등에 따라 다른 계산식을 사용한다. • 동일한 과정의 명령어 그룹을 반복해서 수행해야 할 경우도 있다. 예) 방정식을 수치적으로 풀 때, 구하는 답의 오차가 어떤 기준보다 작아질 때까지 일련의 계산과정을 반복적으로 수행해야 한다. • MATLAB은 프로그램의 흐름을 제어할 수 있는 여러 도구들을 제공한다. • 조건문(conditional statement)과 switch구조는 상황에 따라 명령어들을 건너뛰거나 특정 그룹의 명령어들을 실행시킬 수 있다. • For루프와 while루프는 어떤 명령어 그룹을 여러 번 반복 수행시킬 수 있다. 7장 MATLAB 프로그래밍
프로그래밍 개요 (2/2) • 프로그램의 흐름을 바꾸기 위해서는 프로그램 내에 결정 과정(decision-making process)이 필요하다. 바로 다음 명령을 수행할 것인지, 아니면 하나 또는 그 이상의 명령을 뛰어넘어 다른 명령을 수행할 것인지를 결정해야 한다. 이러한 결정은 관계연산자(relational operator)와 논리연산자(logical operator)를 이용하여 변수들의 값을 비교함으로써 이루어진다. • 함수 파일은 부프로그램(subprogram)으로 프로그래밍에 이용될 수 있다. 프로그램 내에서 함수가 포함된 명령줄(command line)을 만나면 프로그램은 함수에 입력을 제공한 후 그 결과를 기다린다. 함수는 계산을 수행한 후 결과를 “함수 호출” 프로그램에 되돌려 주며, 프로그램은 계속해서 그 다음 명령을 수행하게 된다. 7장 MATLAB 프로그래밍
알고리즘* • 알고리즘(Algorithm) : 한정된 시간 안에 어떤 일을 수행할 수 있도록 잘 정의된 명령어들을 순서에 맞춰 나열한 것으로, 알고리즘은 제어 구조를 이용하여 명령어들의 실행 순서를 변경할 수 있어야 한다. • 알고리즘의 운영 방법 : • 순차적 실행(Sequential operations) : 순서에 따라 명령을 실행시킴 • 조건부 실행(Conditional operations) : 참과 거짓을 판단할 수 있는 질문의 결과에 따라 다음에 수행할 명령들을 결정함. • 반복 실행(Iterative operations or loops) : 어떤 명령그룹들을 반복해서 실행시킴 7장 MATLAB 프로그래밍
구조화 프로그래밍* • 구조화 프로그래밍(Structured programming) • 프로그램의 기능들을 서로 분리하여 계층적 모듈들을 사용하여 프로그래밍하는 것으로, MATLAB에서는 함수들의 집합체로 프로그램을 작성할 수 있다. • 구조화 프로그래밍의 장점 • 전반적으로 문제를 먼저 검토하고 나서 세부적인 사항을 다룰 수 있으므로 구조화 프로그램은 작성하기가 쉽다. • 한 개의 응용문제를 위해 작성한 모듈들(함수들)을 다른 응용문제에도 사용할 수 있다. (이것을 reusable code라고 한다) • 각 모듈은 단 하나의 목적을 수행하도록 설계되었으며 따라서 다른 모듈과 분리하여 테스트할 수 있으므로, 구조화 프로그램은 디버깅하기가 쉽다. • 구조화 프로그래밍은 여러 사람들이 각자 모듈을 개발할 수 있으므로 공통 프로그램에 대해 팀을 이뤄 작업할 때 효과적이다. • 모듈에 의미있는 이름을 부여하고 모듈의 목적을 명확히 알 수 있도록 설명을 붙인다면, 구조화 프로그램은 이해하고 수정하기가 쉽다. 7장 MATLAB 프로그래밍
시작 연산 논리 표현 연산 1 연산 2 종료 흐름도(Flowchart)* • 프로그램의 흐름을 실제 프로그래밍 언어를 사용하지 않고 그림과 간단한 글이나 식으로 표시하는 것으로 긴 프로그램을 작성할 때 도움이 된다. 7장 MATLAB 프로그래밍
관계연산자(Relational operator) (1/5) • 관계연산자는 두 수를 비교하여 결과가 참인지 거짓인지를 결정한다. 결과가 참이면 1을, 거짓이면 0의 값을 준다. • 관계연산자는 수학식 안에서 산술 연산자처럼 사용될 수 있으며, 결과는 배열의 주소 지정에 사용되거나 MATLAB의 다른 명령어들과 함께 사용되어 프로그램의 흐름을 제어할 수 있다. 7장 MATLAB 프로그래밍
>> 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 관계연산자(2/5) • 크기가 같은 두 배열을 비교하면, 원소 대 원소 별로 비교하여각 원소의 비교 결과에 따라 0과 1을 갖는같은 크기의 논리배열(logical arry)을 출력한다. 스칼라를 배열과 비교하면, 스칼라는 배열의 모든 요소와 비교되어 비교 결과에 따라 0과 1을 갖는 논리배열을 출력한다. 7장 MATLAB 프로그래밍
관계연산자(3/5) >> 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 1 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 프로그래밍
관계연산자(4/5) >> 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-24 7장 MATLAB 프로그래밍
>> 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은 논리벡터가 아니므로 주소 지정에 사용될 수 없다. 관계연산자(5/5) • 관계연산의 결과로 얻어진 논리벡터를 다른 벡터 v의 주소 지정에 사용하면, 논리벡터의 원소가 1인 위치에 해당하는 벡터 v의 원소만 추출해 준다. 7장 MATLAB 프로그래밍
>> 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 관계연산자의 응용 (1/2) • 논리벡터가 산술연산에 사용되면, 논리벡터는 먼저 수치벡터로 변환된다. • 산술연산자(+, -, *, /, \ )는 관계연산자보다 연산 순위가 우선이다. 예) z= 5 > 2 + 7 vs. z = 5 > (2 + 7) • 분모가 0이 되어 계산을 못 하게 되는 에러를 막기 위한 기법으로 관계연산자를 이용할 수 있다*. 7장 MATLAB 프로그래밍
>> 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 …… 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 ; >> y = sin(x) ./x >> plot(x, y); grid on 관계연산자의 응용*(2/2) • sinc 함수 의 그래프 그리기 7장 MATLAB 프로그래밍
논리연산자(Logical operator) (1/4) • MATLAB의 논리 연산자 • 논리연산자는 숫자에 대해 작용하며, 0이 아닌 숫자는 모두 참(true)으로 보며, 0은 거짓(false)이다. 7장 MATLAB 프로그래밍
>> x=[5 -3 0 0]; y=[2 0 4 0]; >> x | y ans = 1 1 1 0 >> xor( x, y) ans = 0 1 1 0 >> x & y ans = 1 0 0 0 % 0<x<7의 MATLAB 표현 >> 0 < x & x < 8 ans = 1 0 0 0 >> (0 < x) & (x < 8) ans = 1 0 0 0 >> bool = 2 & -1 bool = 1 >> bool = 1 | 0 bool = 1 >> ~5 ans = 0 논리연산자(2/4) • MATLAB의 논리 연산자 7장 MATLAB 프로그래밍
같은 우선순위를 가진 연산자가 둘 이상 있는 경우, 왼쪽에서 오른쪽 순서로 연산을 수행한다. 논리연산자(3/4) • 논리연산자는 수학식 안에서 산술 연산자처럼 사용될 수 있으며, 결과는 다른 수학식이나 배열의 주소 지정에 사용될 수 있고 MATLAB의 다른 명령어(예를 들어 if)와 함께 사용되어 프로그램의 흐름을 제어할 수 있다. • 논리연산자는 스칼라와 배열에 사용될 수 있으며 서로 섞어 쓸 수 있다. • 논리연산자는 산술연산자(+, -, *, /, \ )와 관계연산자보다 우선 순위가 늦다.단, NOT(~) 연산자는 괄호와 거듭제곱(^) 다음으로 우선 순위가 높음. • 연산자의 우선 순위 1순위 : 괄호(괄호가 중첩되어 있는 경우, 가장 안쪽 괄호가 최우선 순위) 2순위 : 거듭제곱(^) 3순위 : Logical NOT(~) 4순위 : 곱하기, 나누기 5순위 : 더하기, 빼기 6순위 : 관계연산자( >, <, >=, <=, ==, ~= ) 7순위 : 논리연산자 AND(&) 8순위 : 논리연산자 OR( | ) 7장 MATLAB 프로그래밍
x==3의 결과가 0이므로 (y <4)와 상관없이 답이 0이므로 (y<4)는 실행되지 않는다. x==2의 결과가 1이므로 y > 4와 상관없이 결과가1이므로 y > 4는 실행되지 않는다. • MATLAB버전 6 이전에는 우선순위에 변동이 있으므로 괄호를 사용하는 것이 안전하다. 논리연산자(4/4) >> x = -2; y = 5; >> 5 < x & x < -1 ans = 0 >> -5 < x & x < -1 % -5 < x → 1, x<-1 → 1 이므로 1 & 1 → 1이다. ans = 1 >> ~(y < 7) % y < 7 → 1이므로 ~1 → 0 ans = 0 >> ~y < 7 % ~y→ 0이므로 0 <7 → 1 ans = 1 >> ~( (y>=8) | (x <-1) ) % y>=8 →0, x<-1 → 1이므로 ~(0|1) →0 ans = 0 >> x=2; y=3; x==3 && y < 4 ans = 0 >> x==2 || y > 4 ans = 1 7장 MATLAB 프로그래밍
내장 논리함수 (1/4) • and(A, B) ↔ A & B • or(A, B) ↔ A | B • not(A) ↔ ~A • xor(A, B) : A와 B 둘 중 하나만 1일 때 1이다. >> xor(7, 0) ans = 1 >> xor(7, -5) ans = 0 • any(A), any(A, dim) : A가 벡터인 경우 A의 원소중 한 개라도 0이 아니면 1을, 모두 0이면 0을 돌려준다. 즉, A의 원소중에 0이 아닌 원소가 한 개라도 있는 지 검사하는 함수이다. A가 행렬인 경우 A의 각 열(column)을 벡터로 취급하여 각 벡터의 원소중 한 개라도 0이 아니면 1을 돌려준다. >> A = [1 0 0; 0 0 3; 0 0 2]; >> any(A) ans = 1 0 1 7장 MATLAB 프로그래밍
내장 논리함수 (2/4) • ischar(A) : A가 글자 배열이면 논리 1을, 아니면 논리 0을 돌려준다. >> x=[1:3]; s='character array‘; >> ischar(x) ans = 0 >> ischar(s) ans = 1 • isempty(A) : A가 빈 행렬이면 1을, 아니면 0을 돌려준다. >> A=[]; >> isempty(A) ans = 1 >> A(1,1)=5; A(2,2)=3 A = 5 0 0 3 >> isempty(A) ans = 0 7장 MATLAB 프로그래밍
내장 논리함수 (3/4) • isinf(A) : A의 원소가 무한대이면 해당 원소 자리에 1을, 아니면 0을 가진, A와 같은 크기의 배열을 돌려준다. >> x = [-2 -1 0 1 2]; >> isinf(1./x) ans = 0 0 1 0 0 • isnan(A) : A의 원소가 ‘NaN’이면 해당 원소 자리에 1을, 아니면 0을 가진, A와 같은 크기의 행렬을 돌려준다. >> x = [-2 -1 0 1 2]; >> isnan(0./x) ans = 0 0 1 0 0 • logical(A) : 숫자배열 A를 논리배열로 바꾼다. >> x=[4 5 6 7]; bool=[1 0 0 1]; >> x(bool) ??? Subscript indices must either be real positive integers or logicals. >> k=local(bool); x(k) x= 4 7 7장 MATLAB 프로그래밍
내장 논리함수 (4/4) • islogical(A) : A가 논리배열이면 1을, 아니면 0을 돌려준다. >> x=[4 2 8 1]; y=[3 5 6 7]; >> bool = x > y bool = 1 0 1 0 >> islogical(bool) ans = 1 >> z = [ 1 0 1 0]; islogical(z) ans = 0 • isnumeric(A) :A가 숫자배열이면 1을, 아니면 0을 돌려준다. >> isnumeric(bool) ans = 0 >> isnumeric(z) ans = 1 7장 MATLAB 프로그래밍
>> 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 0 공간 제약으로 실제와 다르게 이렇게 표현함 A(1,1) → 1 A(1,3) → -2 A(2,3) → 0 내장 논리함수 find (1/2) • find명령어는 주어진 논리가 참(true)이 되게 하는 벡터나 배열의 원소 주소를 돌려준다. 입력인자는 벡터,배열, 또는 논리 표현식이다. find(A)벡터나 배열인 A에서 0이 아닌 원소의 주소를 돌려준다. k=find(A)벡터나 배열인 A를 하나의 열(column)벡터로 생각하여 0이 아닌 원소의 주소를 돌려준다. [i, j, v]=find(A)배열 A에서 0이 아닌 원소의 주소 (i, j)와 해당 값을 벡터 v로 돌려준다. 7장 MATLAB 프로그래밍
>> 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 (2/2) • find(논리표현식)논리 표현식이 참(true)을 만족하게 하는 배열의 원소 주소를 돌려준다. 7장 MATLAB 프로그래밍
>> 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) ans = 3 예제 온도 데이터의 분석 (1/2) • 대전의 7월 중순의 낮 최고 기온이 다음 표와 같다. 다음을 구하라. 1) 낮 최고기온이 30° 이상인 날은 모두 며칠인가? 2) 낮 최고기온이 25°~28°에 해당하는 날은 모두 며칠인가? 3) 낮 최고기온이 28°~32°에 해당하는 날짜는 언제입니까? 7장 MATLAB 프로그래밍
>> T28to32 = find( 28 <= T & T <= 32) + 10 ans = 14 15 16 17 21 예제 (2/2) 3) 낮 최고기온이 28°~32°에 해당하는 날짜는 언제입니까? 7장 MATLAB 프로그래밍
명령어 ………… ………… if 조건식 …… …… end …… …… MATLAB 프로그램 거짓 if 문 참 MATLAB 명령어 그룹 명령어 그룹 명령어 MATLAB 프로그램 조건문(Conditional statements) • 조건문은 MATLAB이 조건문 다음에 오는 명령어 그룹을 실행시킬 지에 대한 결정을 하도록 하는 명령어이다. • 조건문에는 조건식이 기술된다. 이 조건식이 참이면 조건문 다음의 명령어 그룹들이 실행되며, 거짓이면 명령어 그룹들을 실행하지 않고 건너뛰게 된다. • if – end구조 7장 MATLAB 프로그래밍
if x >=0, y = sqrt(x), end와 같이 한 줄로 쓸 수도 있다. if x>=0 & y>= 0, z=sqrt(x)+y, w=log(x)–log(y), end 와 같이 한 줄로 쓸 수도 있다. if 문 사용 예 (1/2) • 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 7장 MATLAB 프로그래밍
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 문 사용 예 (2/2) • 사용자가 입력한 숫자의 홀, 짝수를 판정하는 프로그램 7장 MATLAB 프로그래밍
파일명 : 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입니다. 예제 7.2 노동자의 급료 계산 • 어떤 노동자가 기준 노동시간인 40시간까지는 자신의 시간당 임금에 따라 급료를 받으며, 초과시간에 대해서는 50%를 더 받는다. 이 노동자의 급료를 계산하는 프로그램을 스크립트 파일로 작성하라. 프로그램 실행시 사용자는 근로시간과 시간당 임금을 입력하게 되며, 프로그램은 급료를 출력한다. 7장 MATLAB 프로그래밍
………… ………… if 조건 식 …… …… else …… …… end …… …… 명령어 MATLAB 프로그램 거짓 if 문 MATLAB 명령어 그룹 1 참 명령 그룹 1 명령 그룹 2 MATLAB 명령어 그룹 2 명령어 MATLAB 프로그램 if – else – end 구조 • 조건판단에 따라 실행해야 할 선택사항이 서로 상반된 두 가지일 경우 if-else-end 구조를 사용한다. 예를 들어 어떤 수의 짝수, 홀수 여부에 따라 다른 명령을 수행해야 할 경우, 짝수에 따른 명령과 홀수에 따른 명령은 서로 독립적이므로 두 가지 조건문이 필요하게 된다. 7장 MATLAB 프로그래밍
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 charge=4000*n; else charge=2700*n; end fprintf('총 배달 요금은 %d입니다.\n', charge); if – else – end 사용 예 • 사용자가 입력한 숫자의 홀, 짝수를 판정하는 프로그램 7장 MATLAB 프로그래밍
탱크 안 물의 체적 0≤h≤19 m일 때 : V =(12.52)h 19<h≤33 m일 때 : function v = watervol(h) % watervol은 급수탑의 물의 체적을 계산한다. % 입력: 물의 높이(m), 출력: 물의 체적(m^3). if h<=19 v=pi*12.5^2*h; else rh=12.5+10.5*(h-19)/14; v=pi*12.5^2*19+pi*(h-19)*(12.5^2+12.5*rh+rh^2)/3; end >> watervol(8) ans = 3.9270e+003 >> watervol(25.7) ans = 1.4115e+004 >> 예제 7.3 급수탑의 물 높이 • 급수탑 탱크는 원통인 밑부분과 원뿔대 모양의 윗부분으로 이루어져 있다. 탱크 안 부표(float)의 위치 h로부터 탱크 안 물의 체적을 구하는 사용자정의 함수를 작성하라. 입력은 h의 값(m)이고, 출력은 물의 체적(m3)이다. 7장 MATLAB 프로그래밍
………… ………… 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 프로그래밍
function x = root2(a, b, c) % root2는 2차 방정식의 근을 구한다. D = b^2 – 4*a*c; tmp1 = -b/(2*a); if ~D % 또는 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 프로그래밍
n = input('소포의 개수를 입력하시오 : '); type = input('등기소포입니까? Y/N[Y] :', 's'); if ( isempty(type)) | (type =='Y') | (type == 'y') type = 'Y'; else type = 'N'; end str = '등기'; unit=4000; if type =='N' str = '보통'; unit=2700; end charge = unit*n; fprintf('%s소포 요금은 총 %d원(%d원%d개)입니다.\n', str, charge, unit, n) • 비교) • if type ==‘Y’ • str = '등기'; unit=4000; • else • str = '보통'; unit=2700; • end 문자열과 조건문 • 예를 들어 ‘Yes’나 ‘No’와 같은 사용자의 문자열 입력에 따라 프로그램의 흐름을 제어하고자 하는 경우 , 조건문에서 문자열과의 비교가 필요하다. • 소포 요금 계산 프로그램 예제 7장 MATLAB 프로그래밍
if isempty(n), error('소포 개수를 입력하세요.'), end m= input('소포의 무게를 입력하시오(kg) : '); type = input('등기소포입니까? Y/N[Y] :', 's'); if ( isempty(type) | (type =='Y') | (type == 'y') ) str = '등기'; if m > 5, unit = 5500; elseif m > 2, unit = 4500; else unit = 4000; end else str = '보통'; if m > 5, unit = 4200; elseif m > 2, unit = 3200; else unit = 2700; end end fprintf('\n소포 %d개의 %s 소포요금은 %d개x%d원=%d원입니다.\n\n', … n, str, n, unit, n*unit) if - elseif - else - end 사용 예 • 소포 요금표를 이용하여 소포의 요금을 계산하는 프로그램을 작성하라. 7장 MATLAB 프로그래밍
명령어 ………… 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 프로그래밍
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 프로그래밍
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 단위로 변환하는 프로그램을 작성해보자. 7장 MATLAB 프로그래밍
Ein=input('변환할 에너지(일)의 값을 입력하시오: '); EinUnits=input('현재 단위를 입력하시오(J, ft-lb, cal, or eV): ', 's'); EoutUnits=input('새 단위를 입력하시오(J, ft-lb, cal, or eV): ', 's'); error=0; switch EinUnits case'J' EJ=Ein; case'ft-lb' EJ=Ein/0.738; case'cal' EJ=Ein/0.239; case'eV' EJ=Ein/6.24e18; otherwise error=1; end 파일명 : EnergyConversion 예제 7.4 에너지의 단위 변환 (1/2) • Joule, ft-lb, cal, eV 단위의 에너지를다른 단위로 변환하는 스크립트 파일을 작성하라.실행시에 에너지의 양과 현재 단위, 원하는 단위를입력해야 하며,변환된 에너지 양을 출력한다.1 J=0.738 ft-lb=0.239 cal =6.24×1018 eV이다.또한 프로그램으로 다음을 변환하라. a) 150 J을 ft-lb로, b) 2800 cal를 Joule로, c) 2.7 eV를 cal로. 7장 MATLAB 프로그래밍
switch EoutUnits case'J' Eout=EJ; case 'ft-lb' Eout=EJ*0.738; case'cal' Eout=EJ*0.239; case'eV' Eout=EJ*6.24e18; otherwise error=1; end if error disp('ERROR current or new units are typed incorrectly.') else fprintf('E = %g %s',Eout,EoutUnits) end 명령창에서의 실행결과 >> >> EnergyConversion 변환할 에너지(일)의 값을 입력하시오: 2800 현재 단위를 입력하시오(J, ft-lb, cal, or eV): cal 새 단위를 입력하시오(J, ft-lb, cal, or eV): J E = 11715.5 J 예제 7.4 (2/2) 7장 MATLAB 프로그래밍
명령어 거짓 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 loop (1/2) • 루프는 명령어 그룹을 어떤 횟수만큼 반복 수행하며, 매회 반복시 적어도 1개 이상의 변수가 루프 내에서 새 값을 할당받는다. 루프에는 반복횟수가 지정된 for-end loop와 지정 조건이 만족될 때까지 반복되는 while-end loop가 있다. • for-end loop for k = f : s: t 명령어 그룹 end 7장 MATLAB 프로그래밍
Loop : for-end loop (2/2) 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 프로그래밍
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 프로그래밍
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 프로그래밍
>> 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 프로그래밍
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 프로그래밍
실행결과 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 • 벡터 v의 원소 중에서 양의 원소의 주소를 알려 주는 프로그램 실행결과 v=[3 -2 0 8 -7]; n=0; for m=1:length(v) if v(m)>0 n=n+1; y(n)=m end end >> find_for y= 1 4 >> find(x>0) ans= 1 4 for-end 루프 사용 예 5 • for 명령어의 루프 인덱스 변수에 실수도 사용될 수 있다. 7장 MATLAB 프로그래밍
(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 이다. 예제 7.5 급수의 합 (1/2) a) for-end루프를 이용하여 급수의 첫 n항의 합 을 계산하는 프로그램을 작성하고, n=4와 n=20에 대해 합을 구하라. b) Taylor 급수를 이용하여 sin(x)를 계산하는 사용자정의 함수 파일을 작성하라. 함수 이름과 인자는 y=Tsin(x,n)으로 한다. 입력인자는 각도(°)인 x와 급수의 항의 개수인 n이다. 이 함수로 항의 개수가 3과 7일 때 sin(150°)를 계산하라. 7장 MATLAB 프로그래밍