1 Matlab 의개요 Matlab이란 MATrix LABoratory를뜻하는말로서, 수치해석, 행렬연산, 신호처리및간편한그래픽기능등을통합하여고성능의수치계산및결과의가시화기능을제공하는프로그램이다. Matlab은그이름이말하듯이행렬또는벡터를기본자료로사용하여기능을수행하는계산환경을제공한다. Matlab은기본적으로행렬자료를다루기때문에차원화 (dimensioning) 가필요하지않으며통상적인프로그래밍언어들을사용하여프로그램을작성하지않고도쉽게수치계산을수행할수있다. Matlab의가장큰특징은 M-file을사용함으로써특정한해를구하는데필요한응용프로그램들을손쉽게작성할수있다는점이다. M-file이란매크로파일로서해석기 (interpreter) 방식으로수행되며사용자가직접작성할수있는프로그램이다. 기본적인내부명령들뿐만아니라다른 M-file들로불러서사용할수있으며, 특정한문제를풀기위하여사용자가직접손쉽게 M-file을작성하여사용할수있다는점이가장큰특징이다. 도구상자 (toolbox) 란이러한 M-file들을응용분야별로모아놓은것으로서, 그종류로는신호처리, 제어계의설계, 동적계의모사, 신경회로망등이있다. 도구상자에이미만들어진여러함수들을이용함으로써쉽게공학문제들을해석할수있다. - 1 -
2 Matlab 의기본적인조작 2.1 기본적인 Matlab 사용법프로그램관리자에서 Matlab 아이콘을더블클릭하면 Matlab의명령창 (command window) 가열리게된다. 명령창이란사용자가 Matlab 해석기와교통할수있는문과같은것이다. Matlab 해석기는사용자로부터명령을받아드릴준비가되어있다는것을알리기위하여 >> 모양의프롬프트를화면에표시한다. 프롬프트가나타나면사용자는 Matlab 명령을입력하여사용할수있다. Current directory II & workspace Current directory I Command history Command window Fig.1-1 Matlab 기본창 예를들어 3x3 인행렬 A 를다음과같이입력하면, A 를다음과같이표현해주며,A matrix 의역행렬 B 를구하기위해 B=inv(A) 라고명령창에서입력함으로써결과를바로 볼수있다. >> A=[1 2 3; 4 5 6; 7 8 8] A = 1 2 3 4 5 6 7 8 8-2 -
>> B=inv(A) http://bml.pusan.ac.kr B = -2.6667 2.6667-1.0000 3.3333-4.3333 2.0000-1.0000 2.0000-1.0000 2.2 명령행 (command line) 의편집 Matlab에는 MS-DOS와같은명령기억기능 (doskey) 이있다. 즉, 방향키 ( ) 를사용함으로써간편하게잘못입력한명령을고치거나전에사용했던명령을다시입력할수있다. 예를들면 2.5의지수함수값에대한 Sine값을구하기위하여아래와같이입력하면, >>sine(exp(2.5))??? Undefined function or variable sine. Sine 함수 sin을 sine으로잘못입력한경우에대한오류메시지이며, 이를수정하기위하여다시명령을입력할필요없이위쪽방향키 ( ) 를누르면 >>sine(exp(2.5)) 가다시나타나고틀린부분을수정해주면된다. 위쪽방향키를누를때마다이전명령이다시커서에나타나므로사용한명령은다시사용할때쉽게편집, 이용할수있다. 아래방향키를누를때는반대로현재표시된명령다음순서에있는명령을띄워준다. 2.3 M-file 작성하기여러개의함수들을사용사용자의목적에맞는실행 file을만들기위해서는 Matlab 의함수들로구성된 M-file을만들어야한다. M-file은 text editor( 예를들면윈도우에있는 notepad) 를사용하여 MATLAB의명령어를차례로입력하면된다. M-file을작성하는방법은 notepad를직접열어작성하거나, 다음그림에서와같이 Matlab의메뉴창에서 File New M-file을선택하면, text를편집할수있는편집창이뜨며 - 3 -
여기서명령어들을입력해주면된다. http://bml.pusan.ac.kr 위에서예를든 matrix 의 inverse 를구하기위한 M-file 예를들면다음과같이두 명령어를차례로써준다. M-file Inv_A.m 의내용 A=[1 2 4; 3 5 6; 6 2 1] B=inv(A) 만들어진 M-file을실행시키기위해서는명령창에서 Inv_A라고입력하고 enter를치면 Inv_A에포함된명령들을수행한다. 문장의실행은순차적으로하게되며문장의끝에 ; (semicolon) 을삽입하면문장의실행내용이 command window에 display 되지않는다. Fig.1-2 Matlab 작성하기 2.4 Help 기능사용 Matlab의함수사용법을알기를원할때는 help 명령을사용한다. 예를들어서 "inv 함수 " 에대한이용방법을알려면 >>help inv - 4 -
위와같이하면자세히그함수에대한설명이나온다. 혹은마우스오른버튼의 스크롤을이용한다. Fig.1-3 Help 기능이용하기 3 Matlab 의행렬연산방법 원칙적으로행렬 (matrix) 과배열 (array) 은의미상차이가있지만, 편의상, 앞으로이들행렬과배열은같은의미로생각하겠다. 기본적으로, "= ( 즉, assignment operator)" 왼쪽에는저장할변수 (variable), 오른쪽에는저장할행렬수식으로이루어진다. 즉, >> 변수명 (variable) = 수식 (expression) 여기서, 변수란 double, char, integer 등을말하며, 수식이란, Matlab 이해석할수있는 numeric and nonnumeric 형의수식을말한다. 3.1 행렬의생성 Matlab으로행렬을만드는경우, 행 (row) 의원소들은 blanks 또는 commas로구분을한다. 열 (column) 의원소들은 semicolon( 즉, ; ) 으로구분하거나 "enter 키 " 를누르면된다. 다작성한행렬요소는 square brackets( 즉, [ ] ) 으로닫아준다. 예를들어서,3 행 3 열의행렬 A 는다음과같이정의, 생성한다. - 5 -
>>A=[1 1 1;1 2 3;1 3 6] A= 1 1 1 1 2 3 1 3 6 http://bml.pusan.ac.kr 3.2 행렬의합과 transpose 이제, 행렬 A 의합을구해본다. 기본적으로 Matlab의모든연산과함수의입력 data 처리는 " 열벡터 " 방향이다. 즉, >>sum(a) 를하면결과는각각의열을더한결과가행벡터형태로나온다. >>sum(a) ans = 3 6 10 여기서, 여러분은재차 Matlab이 " 열벡터 " 방향으로연산한다는데주의해야한다. Matlab은출력변수를설정하지않은경우변수 "ans(answer 의약식 )" 에값을할당한다. 또한, " >>y=sum(a); " 와같이문장맨뒤에 semicolon을쓰면출력결과가표시되지않는다. 행렬의 transpose(i j 행렬을 j i 행렬로바꾸는연산자 ) 에는두가지가있다. 3.3 행렬을구성하는원소들의참조방법 ( 첨자 :subscript) 행렬의원소들은임의의 Matlab 식이될수있다. 여기서, 말하는식이란 Matlab 함수들도포함된다. >>x=[-1.3 sqrt(3) (1+2+3)*4/5] x = -1.3000 1.7321 4.8000 " X " 개개의성분을얻으려면 " ( ) " 안에해당원소의위치 (subscript) 를넣어주면된다. >>x(3) ans = 4.8000-6 -
3.4 The colon operator Colon( 즉, " : " ) 은 Matlab 연산자중에서가장중요한연산자중에하나이다. 사실, Matlab coding을얼마다효율적으로했는가는이 " colon " 의사용방법에달려있다고보아도과언이아니다. >>x=1:10 x = 1 2 3 4 5 6 7 8 9 10 " x " 가 1 부터하나씩증가하여 10 까지증가한다. 만일, 최소값을 "min_val", 최대값을 "max_val" 이라고하고, 증분을 "delta" 라고하면다음과같은형태를취한다. >>x=min_val : delta : max_val >>x=1:2:10 x = 1 3 5 7 9 Colon 연산자는행렬의 subscript로도사용할수있다. Matlab에는 " end " 라는연산자가있다. 이연산자는 " for, while, switch and if " 와연결되어 C 언어에서와같이제어의흐름을조종하기도하고, 행이나열벡터의마지막 index를나타내주기도한다. >>sum_r=sum(y(end,:)) sum_r = 10 여기서, " 10 " 은 " y " 의마지막행 (1, 3, 6) 의합이다. >>sum_c=sum(y(:,end)) sum_c = 8 여기서, " 8 " 은 " y " 의마지막열 (-1, 3, 6) 의합이다. - 7 -
3.5 Matlab 에의한행렬연산 http://bml.pusan.ac.kr 1) 행렬의덧셈과뺄셈 Matlab 은행렬을하나의기본피연산자로간주한다. 그러므로, 행렬의덧셈과뺄셈도 마치스칼라 (scalar) 간의연산과같이간단히표현된다. >>Y=A+B >>X=A+2 행렬에 scalar 를더하거나빼는경우, 이것은반대편행렬의모든원소에그 scalar 를 더하거나뺀효과가된다. 2) 행렬의곱셈과나눗셈 >>X=A*B X 는행렬 " A " 와 " B " 의크기가곱셈상맞으면, 곱셈이행해진다. 곱셈기호 " * " 대신에 ".* " 를이용하면다음과같은결과가생긴다. >>C=[ 1 2 3] >>D=[2 3 4] >>X=C.*D X = 2 6 12 결과를잘살펴보면, ".* " 은원소대원소 (element-by-element) 곱셈인것을알수있다. 그러므로연산자 ".* " 은두개의피연산자인행렬들의크기가같기만하면원소대 원소의곱셈을행한다. 같은방식으로나눗셈을행할수있다. >>X=C/D X = 0.6897-8 -
행렬간의나눗셈은, 이경우벡터 " D " 가역행렬을가져야된다. 그러나, " D " 는벡터로역행렬을가질수없다. Matlab은 " D " 의역행렬을구한것이아니라의사역행렬 (pseudoinverse) 구하여계산한것이다. 3) 행렬의주요연산 행렬의판별식의값은 "det" 라는함수로구할수있다. >>det_a=det(a) inv(a) 는행렬의역행렬을구한다. eig(a) 는행렬의고유치와고유 vector를구한다. jordan(a) 는행렬의 jordan형을구한다. svd(a) 는행렬의 singular value decomposition을행한다. 4 그래프그리기 (Plot 명령 ) 4.1 Plot 함수의기본사용법전형적인사용법 (Syntax): plot.m a) plot(y) : 만일, Y가실수이면, x축은 Y의 index이고, y축은 Y의열벡터들로이루어진다. 그러나, Y가복소수이면, x축은 real(y), y 축은 imag(y) 로이루어진다. b) plot(x1,y1,...) : X1 의열벡터와 Y1 의열벡터가각각의 line 을구성한다. c) plot(x1,y1,linespec,...) : LineSpec 은 color, linestyle, maker 로구성되어선의 style 을결정한다. - 9 -
d) plot(...,'propertyname',propertyvalue,...) : "Line"object 에있는 propertyname/propertyvalue 로선의 style 을결정한다. http://bml.pusan.ac.kr e) h = plot(...) : 여러개의 Line 들이있는경우, 각각의 Line 에할당된 handle value 가열벡터의 모양으로반환된다. >>X=[1:10; 0.7*[1:10]; 0.5*[1:10]; 0.25*[1:10]]'; >>plot(x) >>xlabel('x axis','fontsize',15) >>ylabel('y axis','fontsize',15) >>title('''plot.m'' 함수의이용법 ','fontsize',15) 위와같은일련의명령어를실행하면다음과같은그래프창이만들어진다. Fig.1-4 plot.m 함수의이용법 Fig. 1-4 에서알수있듯이행렬 X 에대한각각의원소들이 Y 축을이루고있고, 행렬 X 에대한 index 가 X 축을이루고있다.( 즉, x=1:length(x)) 선 (line) 들의색이나 type 을 정해주지않으면, 자동으로 default 값에의해결정되어진다. - 10 -
4.2 그래프의범위변환 (Axis) http://bml.pusan.ac.kr 데이터를그래프로표현하고자하는경우, 한쪽데이터의범위 (range) 는일정한경계값으로고정시키고, 다른쪽은데이터의모든양을표현하고싶을때가있을것이다. 즉, 어느구간만보고싶은경우가있을것이다. 이처럼어떠한좌표의한쪽은경계치로고정시키고, 다른쪽은모두표현하고싶을때는 "axis.m" 함수를이용하여보라. 물론, 어떠한좌표의양쪽을일정한경계치로고정시킬수도있다. Axes object의 propertyname 중에서 "xlim, ylim, zlim" 에대해서학습하였다. 이것과같은기능을하는함수가바로 "axis.m" 함수이다. 사용방법 (syntax): axis.m a) axis([xmin xmax ymin ymax zmin zmax]) b) 좌표의범위 (range) 를결정해준다. :2 차원그래프인경우에는 "zmin zmax" 만빼주면된다. >>t=0:1/100:20; >>y=sin(t); >>plot(t,y) 앞에서와같은일련의명령어를실행하면, F 1-5(a) 를얻을수있다. 이제, t 축의범위를 [0 ] 으로바꾸고자한다. 그렇게하기위해서는다음과같은 명령을실행하면된다. >>axis([0 inf -inf inf]) Fig. 1-5(b) 는 t 축의범위를 [0 5] 로바꾼경우의그래프이다. - 11 -
Fig.1-5 axis.m 함수의사용예 4.3 여러개의그래프의동시표현 (subplot) 이번에는여러개의그래프를한개의 figure안에표현하는함수인 "subplot.m" 함수에대해서알아보자. 사용방법 (syntax) : subplot.m subplot(m,n,p) : 하나의 figure 에대해 rectangular 좌표계를원소로갖는 m 행 n 열의작은좌표계를 여러개만들어내고, 좌측상단부터차례로 1,2, m*n 의순서로그래프가들어갈 번호가정해지며 p 번째의자리에그래프를그린다. >>t=0:1/100:20; >>y=sin(t); >>subplot(2,2,1) >>plot(t,y) >>z=cos(2*t); >>subplot(2,2,2) >>plot(t,z) >>x=exp(-t); - 12 -
>>subplot(2,2,3) >>plot(t,x) >>w=exp(-sin(t)); >>subplot(2,2,4) >>plot(t,w) http://bml.pusan.ac.kr 위와같은일련의명령어를실행하면 Fig. 1-6 를얻는다. Fig.1-6 subplot.m 함수에대한사용방법 4.4 Grid 표현 이번에는그래프에첨가해주는 "grid" 에대해서알아보자. x, y 축모두 dotted line style( 즉, :) 의 "grid" 를첨가시키려면단순히 >>grid on 과같이명령하면된다. 왜냐하면, dotted line style의 grid가 default이기때문이다. 또한, active figure에서 "grid line" 을제거하려면단순히 >>grid off 라고명령하면된다. - 13 -
Fig. 1-7 grid on 한상태의그래프 또한, "grid" 의종류로도여러가지효과를줄수있다. a) xgrid, ygrid, zgrid: 각각의좌표축에만 "grid" 를첨가시킨다. b) gridlinestyle: "grid" Line 의 style 을변경할수있게해준다. >>t=0:1/1000:1; >>x=exp(-t); >>plot(t,x) >>set(gca, 'xgrid', 'on', 'gridlinestyle', '-.') 위와같은일련의명령어를실행하면, Fig. 1-8 의결과를얻는다. 이제, x 축에만 style 이 " -. " 인 "grid" 를첨가시킬것이다. Fig. 1-8 은그결과를보여주고있다. - 14 -
Fig. 1-8. x 축만 grid 첨가그래프겹쳐서그리기 (hold on) 만일, Fig. 1-9와같은 figure안에다른그래프를첨가하려면, Fig. 1-9를생성한뒤에 ">>hold on " 하면된다. 그러면, Fig. 1-9의 figure가사라질때까지앞으로나오는모든그래프는 Fig. 1-9의 figure에합쳐져서나타난다. 더이상같은 figure에그래프를첨가시키고싶지않으면 ">>hold off" 라고명령한다. 그러면, 이후만들어지는그래프는새로운 figure에나타난다. Fig. 1-9. Hold on 을사용한그래프 - 15 -
5 Structured Programing 은 5.1 decision (if, else, while ) Matlab의기본적인문장의시작과끝은구조문과 end를이용한다. 예를들어 if 문의경우다음과이 if 이후에판단하고자하는 logic이들어가며참일시에 end사이의명령을수행한다. If grade <=60.. end 관계연산자의형태는다음과같다. 이때 C 언어 (!=) 와의차이점은 같이않다. (~=) 이다. 그외나머지구조에대해서는기본적으로 C 와유사하다. (If..elseif...) 5.2 loops for 의경우에도기본적으로 C 언어의형태 for(i=0;i<100;i++) 와유사하지만 Matlab 에서는다음과같이사용한다. for i=1:100. End for 이후의가감문의형태는위에서배운 colon 의형태를취한다. - 16 -
6 Matlab 기본명령어 http://bml.pusan.ac.kr - 17 -
- 18 - http://bml.pusan.ac.kr
위와같은명령어들에대해서는직접사용하면서 help 를이용하여도움받기를권장합니다. 또한 Matlab 의경우많은형태의입력형태가있으므로이는 help 창을이용하면쉽게습득할수 있을것입니다. 기타수업에관련된자료및의문사항은실험실홈페이지의강의 (Lecture) 로문의하기 바랍니다. Homepage: http://bml.pusan.ac.kr Email: mk2000@pusan.ac.kr - 19 -