강의 4: Matlab 사용법 공학컴퓨터활용입문 충남대학교 메카트로닉스공학과
강의 4: Matlab 사용법
공학컴퓨터활용입문
충남대학교메카트로닉스공학과
2
2.6 산술 연산
2.6.1 기본 연산
Matlab에서채용하는기본적인산술연산자는다음과같다.
3
2.6 산술 연산
2.6.1.1 덧셈과 뺄셈 연산
동일차원의두배열의합과차연산은각대응되는원소간의합과차연산을수행하게된다.
특별한목적으로Matlab은배열과스칼라간의합과차연산도가능하도록설계해놓고있는데, 이경우에는배열의각원소에스칼라값을더하거나빼준다.
4
2.6 산술 연산
2.6.1.2 곱셈 연산
두배열간의곱셈은선형대수법칙에따라연산해준다.
곱연산시 A의열과 B의행의길이가같아야한다.
5
2.6 산술 연산
2.6.1.3 나눗셈 연산
Matlab은선형대수법칙에따라왼쪽나눗셈(\)과오른쪽나눗셈(/) 두가지형태의나눗셈연산을제공하고있다.
행렬A가정칙행렬이면왼쪽의나눗셈은선형방정식Ax = b의해 x를,
오른쪽나눗셈은 xA = b의해 x를구하기위해사용된다.
두나눗셈연산은가우스소거법을기반으로하고있다.
6
2.6 산술 연산
2.6.1.3 나눗셈 연산
스칼라 b와행렬A의나눗셈 C = b/A는허용되지않으나 C = b\A = A/b는허용된다.
7
2.6 산술 연산
2.6.2 배열 연산
원소별연산이라고도불리는배열연산은Matlab의필요에의해만든것으로서, 같은위치의배열원소끼리수행되는특수연산이다.
배열연산자는 ‘.’를기본연산자앞에결합해서표시하며다음연산을수행해준다.
배열연산은같은차원의배열과배열간혹은스칼라와배열간에만가능하다.
특히합(+)과차(-)는이미배열연산을수행하고있는연산자이므로굳이‘.’를붙일필요는없다.
8
2.6 산술 연산
2.6.2 배열 연산
다음예에서두벡터 [2 3 4]와 [1 2 3]의배열곱셈과벡터 [2 3 4]의배열세제곱결과는왼쪽과같다.
두행렬 [1 2; 3 4]와 [4 3; 2 1]의배열곱셈과나눗셈의결과는오른쪽과같다.
9
2.6 산술 연산
2.6.2 배열 연산
스칼라 b와행렬A와의배열연산은다음과같다.
10
2.6 산술 연산
예제 2.3
x = 0, 1, 2, 3일때 값을계산해보자.
예제 2.4
다음 sinc 함수의그래프를그리는스크립트를작성해보자.
2.6 산술 연산
예제 2.5
다음두함수의그래프를같은화면에그려보자.
12
2.6 산술 연산
2.6.3 내장함수
Matlab은다양한학문분야에서필요로하는많은내장함수들을만들어제공하고있는것이큰특징이다.
더자세한함수목록은아래 help 명령어를통해살펴볼수있다.
특히함수들은다양한형식으로호출될수있으므로자세한사용법을알고자하면Matlab도움말과사용예를참조하면된다.
help elfun : 기본수학함수들을보여준다.
help elmat : 기본행렬과행렬조작함수들을보여준다.
help specfun : 특별한수학함수들을보여준다.
13
2.6 산술 연산
2.6.3.1 삼각함수
Matlab에서삼각함수를계산할수있는명령어는여러가지가있으며, 그중에서자주사용되는것들만예시하면다음과같다.
특히 atan2를사용할때주의할점은 y 좌표를먼저써주어야한다는것이다.
14
2.6 산술 연산
2.6.3.1 삼각함수
제 1사분면상의점 (2,3)과원점과이루는각계산에 atan를사용하면다음과같다. atan은제 1,4사분면에만적용할수있음에유의하라.
제 2사분면상의점 (-1,1)과원점과이루는각을계산할때에는 atan2를사용하면된다.
15
2.6 산술 연산
2.6.3.2 지수함수, 제곱근함수, 로그함수와 복소함수
Matlab에서취급하는지수함수, 제곱근함수, 로그함수와복소함수명령어는다음과같다.
16
2.6 산술 연산
2.6.3.2 지수함수, 제곱근함수, 로그함수와 복소함수
17
2.6 산술 연산
2.6.3.3 통계함수
Matlab에서처리할수있는통계함수중자주사용되는명령어는다음과같다.
18
2.6 산술 연산
2.6.3.3 통계함수
벡터 x = [2 3 9 4 1 6]에대하여최대값, 합, 평균값과표준편차를구하면다음과같다.
19
2.6 산술 연산
2.6.3.4 수치함수
fix(x) : 소수부분을절단한정수를반환한다.
floor(x) : x를넘지않는가장큰정수를반환한다.
ceil(x) : x를넘는가장작은정수를반환한다.
round(x) : x에가까운정수를반환한다.
rem(x,y) : x를 y로나눌때나머지를반환한다.
sign(x) : 부호함수로서 x가양이면 1, 음이면 -1, 0이면 0을반환한다.
20
2.6 산술 연산
2.6.3.5 난수발생 함수
rand : [0,1) 구간에서균등하게분포되는난수를생성한다. 0은포함되고1은포함되지않는다.
rand(n), rand(n,n) : [0,1) 구간에서균등분포난수행렬을생성한다.
rand(‘seed’,n) : seed 값을 n으로설정하여 rand를초기화한다. n은 0
또는양의정수이다.
randn : 평균이 0이고표준편차가 1인정규분포난수를생성한다.
randn(n), randn(n,n) : 평균이 0이고표준편차가 1인정규분포난수행렬을생성한다.
randn(‘seed’,n) : seed 값을 n으로설정하여 randn을초기화한다. n은 0
또는양의정수이다.
21
2.6 산술 연산
2.6.3.5 난수발생 함수
rand 또는 randn의초기화명령어를생략하면첫호출시자동적으로seed값은 0으로설정되고, 그이후같은프로그램을실행해도난수는반복되지않는다.
같은순서의난수를얻고싶을때에는 rand 또는 randn 호출전에반드시초기화명령어를사용하여야한다.
22
2.6 산술 연산
2.6.3.5 난수발생 함수
rand는 [0,1) 구간에균등하게분포되는난수를생성하지만 (b-a)*rand+a
식으로 [a,b) 구간에분포되는난수로바꿀수있다.
[a,b] 구간의정수를발생시키는식은 floor[(b+1-a)*rand]+a 이다.
randn은평균이 0이고표준편차가 1인정규난수를생성하지만이또한𝜎*randn+m 식을쓰면평균이m이고표준편차가 𝜎인정규난수로변환할수있다.
23
2.6 산술 연산
예제 2.6
평균이 0이고표준편차가 0.5인 1x200 정규난수벡터와 [-1,1) 구간에분포되는 1x200 균등난수벡터를만들어히스토그램을그려라.
24
2.6 산술 연산
2.6.3.6 문자열처리 함수
str = num2str(x) : 숫자 x를문자열로변환해준다. x가배열이면 str도배열이된다.
str = num2str(x,’format’) : 지정된형식으로숫자 x를문자열로변환해준다.
x = str2num(str) : 문자열을숫자 x로변환해준다. str이배열이면 x도배열이된다.
x = strdouble(str) : 문자열을배정도숫자 x로변환해준다.
num2str 함수는수치값을문자열로변환한후이를그래프의라벨이나제목에달때유용하게사용할수있다.
25
2.6 산술 연산
2.6.3.6 문자열처리 함수
str2num 함수는문자열에공백이포함되면이를정확하게수로표시하지못할수도있으므로 str2double 함수를사용하면문제가해결된다.
lstr = lower(str) : 문자열내의대문자를소문자로변환해준다.
ustr = upper(str) : 문자열내의소문자를대문자로변환해준다.
26
2.6 산술 연산
2.6.3.6 문자열처리 함수
TF = strcmp(str1, str2) : 대소문자를구분해서두문자열을비교하고같으면 1, 틀리면 0을반환한다.
TF = strcmpi(str1, str2) : 대소문자를구분하지않고두문자열을비교하고같으면 1, 틀리면 0을반환한다
k = strfind(str, substr) : 문자열내에서특정문자열의위치를알려준다.
대소문자를구분한다.
substr = strtok(str, c) : 문자열내에특정문자 (c)에의해구분되는첫토큰을반환한다. 대소문자를구분한다.
27
2.6 산술 연산
2.6.3.6 문자열처리 함수
28
2.6 산술 연산
2.6.3.7 기타 행렬 연산
inv(A) : 행렬A의역행렬을반환한다.
det(A) : 행렬A의행렬식을반환한다.
eig(A) : 행렬A의고유치를반환한다.
[v,d] = eig(A) : 행렬 A의고유치와고유벡터를반환한다.
29
2.7 흐름 제어 도구
2.7 흐름 제어 도구
앞서예시한명령어들은모두입력된순서대로순차적으로실행되는것을보아왔지만, 복잡한구조의프로그램에서는조건에따라그처리순서가바뀌는것을종종경험한다.
Matlab도일반적인프로그래밍언어들과마찬가지로흐름을제어할수있는몇가지도구들을포함하고있다.
관계연산자와논리연산자는값들을비교함으로써처리순서제어를위한의사결정을돕고, 일련의명령어 if, switch, while, for 등은처리순서를바꾸거나, 여러번반복하게해준다.
이러한흐름제어문을사용함으로써, 복잡하고반복되는알고리즘을효율적으로프로그래밍할수있다.
30
2.7 흐름 제어 도구
2.7.1.1 관계 연산자
관계연산자는두피연산자의크기를비교하기위하여사용되며, 비교결과참일경우에는 1, 거짓일경우에는 0의값을제공한다.
Matlab에서는같은차원의두배열을비교하는것도가능하다. 이경우에는대응되는원소끼리비교되며, 비교결과에따라 1 또는 0의원소값을갖는배열이된다.
배열과스칼라의비교도허용된다. 이경우에는배열의모든원소들은스칼라와비교되며, 그결과에따라 1 또는 0의원소값을갖는배열이된다.
< : 작다 <= : 작거나같다 > : 크다 >= : 크거나같다 == : 같다 ~= : 같지않다
31
2.7 흐름 제어 도구
2.7.1.1 관계 연산자
32
2.7 흐름 제어 도구
2.7.1.1 관계 연산자
관계연산자는산술연산자보다연산우선순위가낮기때문에같은문장에서혼용해서사용할때에는주의를요하고, 우선순위를변경할필요가있으면괄호를쓰면된다.
33
2.7 흐름 제어 도구
2.7.1.2 논리 연산자
논리곱, 논리적과논리부정을연산해주는논리연산자는다음과같으며,
실행결과는 1 또는 0의값을갖는다.
논리연산자도관계연산자와같이같은차원의배열간또는배열과스칼라간의비교에사용될수있다.
& : 논리곱(AND)
| : 논리적(OR)
~ : 논리부정(NOT)
34
2.7 흐름 제어 도구
2.7.1.2 논리 연산자
이외에도Matlab은두논리연산자 &, |와같은의미를가지는두단락논리연산자를가지고있으며다음과같다.
이들은연산시간을단축시켜주므로 &와 |보다더자주쓰이며, 논리식의결과가좌측피연산자에의해완전히결정되면연산을끝낸다.
&& : 논리곱(AND)
|| : 논리적(OR)
35
2.7 흐름 제어 도구
2.7.1.3 연산 우선순위
같은우선순위를가지는연산자들은먼저나오는연산자가우선순위를가지며괄호내의수식도우선순위에따라연산된다.
우선순위 연산자 설명 1 () 괄호, 중첩될때안쪽이우선됨 2 ^ 지수연산자 3 ~ 논리부정(NOT) 연산자 4 *, / 곱셈, 나눗셈연산자 5 +, - 덧셈, 뺄셈연산자 6 >,<,>=,<=,==,~= 관계연산자 7 &, && 논리곱(AND) 연산자 8 |, || 논리합(OR) 연산자
36
2.7 흐름 제어 도구
2.7.1.4 논리 함수
Matlab은스칼라와배열에서동작하는많은논리함수를가지고있다.
find를제외한함수들은스칼라 1(참) 또는 0(거짓)의논리값들을돌려준다.
any(x) : x의어떤원소라도 0이아니면 1, 모두 0이면 0을반환한다.
all(x) : x의모든원소들이 0이아니면 1, 하나라도 0이면 0을반환한다.
I = find(x) : x의 0이아닌원소의색인을포함하는벡터를반환한다.
isempty(x) : x가빈배열이면 1, 아니면 0을반환한다.
isnan(x) : x의원소중에 NaN이있으면 1, 아니면 0을반환한다.
isinf(x) : x의원소중에 +inf 또는 –inf가있으면 1, 아니면 0을반환한다.
37
2.7 흐름 제어 도구
2.7.1.4 논리 함수
38
2.7 흐름 제어 도구
2.7.1.4 논리 함수
앞의예제 2.4에서 sinc 함수값을구할때 x = x+eps 문장을써서 x의모든원소에일률적으로작은 eps값을더했지만, 이문장은다음과같이수정해서사용하는것이더나은방법이라할수있다.
39
2.7 흐름 제어 도구
2.7.2 For-end 문
for-end 문은 for와 end 사이에있는하나이상의문장을미리정해진횟수만큼반복연산할때사용하며, 다음과같은형식을가진다.
인덱스변수 var는초기값 s부터시작하여마지막값 f를초과(또는미달)하지않는동안계속 step만큼증가(감소)된다.
step > 0인경우, 먼저 var = s가설정되고난다음 f와비교되며,
var<=f이면블록내의문장이실행되고또 var=var+step이된다.
var가 f를초과하면 end로건너뛰어그다음문장을계속실행하게된다.
for=end 문사이에는여러개의문장들이나복수의 for-end 문이올수있다.
40
2.7 흐름 제어 도구
2.7.2 For-end 문
여기서는 step = -2이고 s>f이므로루프는 2번반복된다.
다음프로그램이실행되면루프는세번수행된다.
41
2.7 흐름 제어 도구
예제 2.7
for-end 문을사용해서 6!= 1x2x3x4x5x6을계산하는스크립트를작성해보자.
42
2.7 흐름 제어 도구
예제 2.8
for-end 문으로 1부터 100까지의정수를합산하는스크립트를작성해보자.
43
2.7 흐름 제어 도구
예제 2.9
3x3 magic 행렬의모든원소의합을계산하라. 이때 for-end 문을사용하라.
44
2.7 흐름 제어 도구
2.7.3 while-end 문
while-end 문도 for-end 문과비슷한순환구조를갖지만반복횟수가미리정해져있지않은상황에서사용되며, 다음과같은형식을가진다.
조건식 expression의논리적결과가참이되는한, 계속해서while과end 사이의문장들을실행하게된다.
조건식에적어도하나이상의변수가포함되어루프전에초기화되고또루프내에서새로운값을할당받든지아니면루프내에조건문과break문을서서무한루프에서빠져나올수있도록해줘야한다.
45
2.7 흐름 제어 도구
2.7.3 while-end 문
위의내용을무한루프내에조건문과 break문을써서스크립트로작성하면다음과같다.
46
2.7 흐름 제어 도구
예제 2.10
while-end 문을사용하여 1+2+3+…+n의값이 50보다커지는최소의 n을구하는스크립트를작성해보자.
47
2.7 흐름 제어 도구
2.7.4 if-end 문
if-end 문은조건에따라문장을선택해서수행하는문장이다.
첫줄의 if 문은조건식을가지며이식의결과가참이면 if 다음문장이실행되고, 거짓이면 end 다음문장이계속실행된다.
48
2.7 흐름 제어 도구
2.7.4 if-end 문
49
2.7 흐름 제어 도구
예제 2.11
벡터 x = [1 2 3 … 9]로부터홀수와짝수위치의값들을 각각합산하는프로그램을작성해보자.
50
2.7 흐름 제어 도구
예제 2.12
2차방정식의계수값 a = 2, b = 3, c = 3을받아실근인지, 허근인지를판별하고두근을구하는스크립트를작성해보자.
51
2.7 흐름 제어 도구
2.7.5 Switch-end 문
switch-end 문은첫번째줄의 switch_var의값이 case의값과일치하면해당문장을수행하고, 만약일치하는값이없으면 otherwise 내의문장을수행한다.
var1, var2는값이나문자열이될수있고 switch_var의양쪽에소괄호‘()’를두어도된다.
52
2.7 흐름 제어 도구
예제 2.13
입력한성적등급에따라해당문자열을출력해주는프로그램을작성해보자.
53
2.7 흐름 제어 도구
2.7.6 Break 명령어
break 명령어는일반적으로 for-end나 while-end 문과같은반복루프안에서많이사용되는데, 어떤조건이만족될때반복과정을끝내주는역할을한다.
Matlab은 break 명령어가나타나면 end 명령어로점프한후그다음명령어를계속수행하게된다.
함수 f(x) = 2(x-1)^2의최소점을찾는알고리즘은다음과같다.
여기서 xk는 k 번째반복시행에서구한 x값, 계수 𝛼= 0.2, 초기값
x0=0이고, 정지조건이 일때근사해를찾는
스크립트를작성하면다음슬라이드와같다.
54
2.7 흐름 제어 도구
2.7.6 Break 명령어