공학컴퓨터활용입문 강의 4: Matlab 사용법 충남대학교메카트로닉스공학과
2.1 스크립트 m- 파일 2.1 스크립트 m- 파일 줄수가많아지면입력과수정이지루할뿐만아니라라이브러리구축, 디버깅과유지보수면에서도효과적이지못하므로 m- 파일을만들어사용하게된다. m- 파일이란일괄처리하도록 Matlab 명령어들을취합해놓은배치파일을말하며, 문자로시작하는파일명에확장자 (.m) 를가진다. m- 파일은크게스크립트 m- 파일과함수 m- 파일로구분된다. 외형적인차이는함수 m- 파일의첫실행문이반드시 function 으로시작된다는점이고, 내부적인차이는스크립트 m- 파일은명령창이사용하는작업공간과같은기억장소를공유하지만, 함수 m- 파일은별도의기억장소를사용한다는점이다. 때문에스크립트 m- 파일의모든변수들은명령창에서접근이가능하지만, 함수 m- 파일의변수들은접근이불가능하다. 2
2.1 스크립트 m- 파일 2.1.1 편집기의호출 Matlab 은스크립트파일을만들수있는자신의편집기를가지고있다. 새스크립트파일을작성하려면데스크탑창에서 < 새스크립트 > 나 < 새로만들기 > 에서스크립트를누르거나명령줄에서 edit 를실행하면되고기존의파일을열어편집하려면 < 열기 > 를누르면된다. 편집기와관련해서는 3 개의탭 ( 편집기탭, 퍼블리시탭, 보기탭 ) 이새로만들어진다. 편집기탭에는대부분의주기능들이들어있으며, 보기탭에는편집기창을분할하고결합해주는아이콘들이들어있다. 3
2.1 스크립트 m- 파일 2.1.2 스크립트파일편집 스크립트를입력하거나수정할때몇가지유의할점은다음과같다. 명령어입력시맨앞에프롬프트 (>>) 를넣을필요가없다. 여러개명령어입력 (, ;) - 명령어와명령어사이에콤마 (,) 또는세미콜론 (;) 를둠으로써한줄에여러개의명령어들을입력할수있다. 출력억제 (;) - 명령어의마지막에 ; 를붙이면출력이화면에표시되지않는다. 명령어연결 ( ) - 명령어가길어서한줄에다적을수없을경우에는각줄의마지막에마침표세개 ( ) 를붙이고 <Enter> 키로줄바꿈을한다음이어서입력. 주석문입력 (%) - 퍼센트기호 (%) 를입력하면거기서부터그줄의마지막까지는주석으로간주되고실행되지않는다. 여러줄의일괄적주석처리 - 주석처리할줄들을선택하고를누르면되고, 반대로해제할경우에는를누르면된다. 4
2.1 스크립트 m- 파일 2.1.2 스크립트파일편집 5
2.1 스크립트 m- 파일 2.1.3 스크립트파일저장 새스크립트가완성되면저장할수있다. 저장버튼또는 < 다른이름으로저장 > 을누르면파일명을입력하라는별도의창이나타나며여기에파일명을입력하고 < 저장 > 버튼을누르면저장된다. 파일명을정하는규칙은변수명을정하는것과같다. 파일저장시입력한파일명에는확장자 (.m) 가자동첨부되고, 사용자가별도로폴더를지정하지않으면현재폴더에저장된다. 기존파일을불러와서수정한다음실행만해도자동적으로저장된다. 6
2.1 스크립트 m- 파일 2.1.4 스크립트파일실행 스크립트를실행하는방법은두가지가있다. 하나는편집기에서, 다른하나는명령창에서실행하는방법이다. 편집기 : 스크립트를완성하고저장한다음상단의실행버튼을누르면실행된다. 7
2.1 스크립트 m- 파일 2.1.4 스크립트파일실행 명령창 : 명령줄에스크립트파일명을입력하고 <Enter> 키를누르면실행된다. 이때확장자는생략해도된다. 8
2.1 스크립트 m- 파일 2.1.5 디버깅 스크립트를작성하다보면숙련된프로그래머들조차도가끔문법오류와논리오류에직면하게된다. 문법오류는정해진규칙에따라스크립트를작성하지않았을때생기는오류이며, 논리오류보다더빈번히발생한다. 이오류는 Matlab 번역기가알려준다. 한줄의명령어를완성중이거나또이전에입력한줄에서문법상의경고나오류가발견되면, 그수준에따라오른쪽상단의녹색사각형의색이점점빨간색으로변한다. 노란색은경고로서해당프로그램을수정하지않아도실행은되지만최대한수정할필요가있고, 빨간색은오류를찾아수정해야만정상적인실행이가능하다. 실행을해도번역기가오류메시지를명령창에반환하고그위치를알려준다. 9
2.1 스크립트 m- 파일 2.1.5 디버깅 논리오류는문법적으로는오류가없어실행은되지만결과가틀리거나무한루프 (infinite loop), 오버플로 (over flow) 오류와같은예측할수없는동작을유발하는프로그래밍상의오류를말한다. 이런오류는일반적으로찾아내기가쉽지않으며, 편집기의디버깅기능을이용하여변수값들을단계적으로추적할수밖에없다. 문제가있을것으로생각되는위치에서실행이멈추도록마우스로문장번호옆 - 부분을클릭하여브레이크포인트를설정하고, 실행버튼을누르면다음슬라이드의그림과같은화면이나타난다. 예로빨간원 의위치가설정한브레이크포인트이고 가현재까지실행된스탭이다. 브레이크포인트는실행가능한명령문에서만설정할수있다. 실행된문장의변수위에마우스를갖다대면값이나타난다. 프로그램을한줄한줄씩실행하는 < 스텝 > 기능, 피호출함수안으로끼어들거나빠져나오는 < 스텝인 > 과 < 스텝아웃 > 기능등다양한기능들이있다. 10
2.1 스크립트 m- 파일 2.1.5 디버깅 편집기에서디버깅실행 11
2.2 변수와예약어 2.2.1 변수 변수는정수, 실수, 문자등의데이터를담을수있도록사용되는이름을말한다. 새로운변수가정의되고, 여기에값이할당되면컴퓨터메모리공간이할당되며, 이후로명령어나수식등에사용할수있다. Matlab 은내부적으로모든변수를배열로취급하며, 다음규칙에따라정할수있다. 1) 변수는문자, 숫자, 밑줄 (_) 의조합으로이루어지며, 그길이는 64 개까지가능하다. 2) 반드시문자로시작해야하며공백, 마침표, 콤마, 세미콜론을포함해서는안된다. 3) 대문자와소문자는구별되어야한다. 예를들어 value, Value, VALUE 는서로다른변수를의미한다. 4) Matlab 내장함수명 (sin, exp, sqrt 등 ) 과명령어 (for, if, plot 등 ) 를가급적변수로사용하지않도록한다. 일단이들을변수로사용하게되면, 처음정의된함수나명령어의의미는사라지게된다. 12
2.2 변수와예약어 2.2.1 변수 13
2.2 변수와예약어 2.2.1 변수 변수에문자열을할당할때에는작은따옴표 ( ) 내에글자, 숫자, 기호, 공백들의조합으로된문자를두면된다. 변수에문자열을할당하면문자들은배열에저장되며, 각문자는배열의한원소가된다. 원소의위치정보로각문자에접근할수있다. 14
2.2 변수와예약어 2.2.2 예약어 다른컴퓨터언어와마찬가지로 Matlab 도 for, if, sin, cos, case 등많은예약어를가지고있다. 자세한정보는도움말창에서 <reserved keywords> 로찾으면된다. 다음예약어들은프로그램중에서재정의해서쓸수있지만, 이렇게되면처음정의된그변수의의미는사라지게된다. pi : 원주율로정의된다. i : 복소수연산자로정의된다. j : i 와같다. eps : 상대적정밀도를의미하는작은값으로서이다. Inf : 무한대로정의된다. NaN : 수가아님 (Not-a-Number) 을뜻한다. 15
2.2 변수와예약어 2.2.2 예약어 다음은 x = cos(2π) 계산에예약어 pi 의사용예이다. 복소수는다음과같이입력할수있지만, 별표 (*) 없이입력한경우에는 I 또는 j 가반드시숫자다음에와야한다. 16
2.2 변수와예약어 2.2.2 예약어 두복소수 z1 = 3+4j, z2 = 7j 의곱셈과나눗셈을계산해주는예를보자. 위의경우는원하는값을얻을수있다. 하지만예약어 i 또는 j 를변수로미리사용하게되면복소수기호로서의효력이사라진다. 17
2.2 변수와예약어 2.2.2 예약어 i 와 j 는복소수연산이없는프로그램에서자주 for-end 문과함께재정의해서사용되기도한다. 극한연산에서는이지만, 현재우리가쓰는컴퓨터는그한계상 sin(0)/0 을연산할수없다. 이연산을실행하면 Matlab 은 NaN 을되돌리는데, 이때 eps 를사용하면원하는결과를얻을수있다. 다음연산결과는무한대임을보여준다. 18
2.3 데이터저장하고불러오기 2.3 데이터저장하고불러오기 명령줄이나스크립트파일에서변수에값을할당하면이는 Matlab 작업공간이라는메인메모리영역에저장되어남아있게된다. 작업공간에저장된변수들은 clear 명령어를사용하거나 Matlab 을종료하면지워지므로여러가지방법으로출력하거나물리적저장매체에저장할수있다. 19
2.3 데이터저장하고불러오기 2.3.1.1 MAT- 파일로저장하기 작업공간에저장되어있는변수값을 MAT- 파일, 즉정형화된이진파일로저장하고싶을때에는 save 명령어를사용하면된다. save fname var1 var2 : 두변수 var1, var2 의값, 변수명, 유형등을파일명 fname 에저장해준다. 저장할변수가더있으면공백을두고추가하면된다. save( fname, var1, var2 ) : 위의명령어와같다. 이명령어를실행시키면자동적으로확장자.mat 가붙는이진파일 (binary file) fname.mat 가생성된다. 한가지유념해야할것은 MAT- 파일은텍스트파일에비해입출력전달속도가빨라대용량의데이터를처리할때효과적이지만, 일반적인파일편집기로는열어볼수없다는점이다. 20
2.3 데이터저장하고불러오기 2.3.1.2 ASCII 파일로저장하기 명령어 save 는 ASCII 또는텍스트형식의파일저장에도쓸수있으며, 이때는다음과같은형식으로쓰면된다. save fname var1 var2 ascii : 두변수 var1, var2 의값을파일명 fname 에 ASCII 형식으로저장해준다. save( fname, var1, var2, -ascii ) : 위의명령어와같다. 결합된변수 buf 의값을파일명 fname2 에 ASCII 형식으로저장하고싶을때에는다음과같이하면된다. 저장된 ASCII 형식의파일내용은 type 명령어로볼수있다. 21
2.3 데이터저장하고불러오기 2.3.2.1 MAT- 파일불러오기 save 의반대개념으로서 load 는저장된파일로부터데이터를읽어주는명령어이다. MAT- 파일을읽기위해서는다음형식을사용하면된다. load fname : fname.mat 파일로저장된변수들을읽어준다. 실행되면파일의모든변수들이저장당시의이름, 유형, 값을가지고작업공간에추가된다. 확장자.mat 는생략가능하다. load( fname ) : 위의명령어와같다. fname 에어떤변수가저장되어있는지를알고싶을때에는 who 명령어를사용하면된다. 22
2.3 데이터저장하고불러오기 2.3.2.2 ASCII 파일불러오기 ASCII 또는텍스트파일을읽는방법은 MAT- 파일을읽을때와유사하며, 그형식은다음과같다. load fname : ASCII 또는텍스트파일 fname 에서데이터를불러온다. 불러온데이터는파일명과같은이름의변수에할당된다. load( fname ) : 위의명령어와같다. var = load( fname ) : fname 에서불러온데이터가 var 에할당된다. 다음예는 buf 의내용을 ASCII 형식으로파일 fname2 에저장한다음, 이를다시읽고그내용을확인해준다. 23
2.4 벡터와행렬의입력과조작 2.4 벡터와행렬의입력과조작 Matlab 은내부적으로모든변수를배열형태로표시하며, 단순변수는 1x1 배열로, 벡터는 1 x n 또는 n x 1 배열로, 2 차원행렬은 n x m 배열로간주된다. 이배열에는값또는문자가저장된다. 2.4.1.1 벡터입력 ( 직접입력 ) 벡터는변수에원소를할당함으로써생성되고, 생성방법으로는몇가지가있다. 직접입력 : 벡터를직접입력할때에는대괄호 ([ ]) 안에원소들을나열하는식으로입력하면된다. 이때원소와원소간에공백이나콤마 (,) 를두어야한다. 특히열벡터를만들때에는원소사이에세미콜론 (;) 을두어야한다. 다음슬라이드의예는행벡터와열벡터를만드는방법을보여준다. 행벡터를열벡터로, 다시열벡터를행벡터로변환할때에는전치 (transpose) 를의미하는기호 ( ) 를사용하면된다. 24
2.4 벡터와행렬의입력과조작 2.4.1.1 벡터입력 ( 직접입력 ) 25
2.4 벡터와행렬의입력과조작 2.4.1.1 벡터입력 ( 명령어로생성하기 ) 명령어로생성하기 : 벡터의차원이클경우에는수작업으로벡터를입력하는것자체가불가능할때가있다. 이런경우에는다음과같은방법으로생성하면된다. x = xmin:step:xmax : 첫원소가 xmin 이고, 간격이 step 이며, 마지막원소 xmax 를초과 ( 또는미달 ) 하지않는벡터를생성한다. x = [xmin:step:xmax] : 위의명령어와같다. x = linspace(xmin,xmax,n) : xmin 과 xmax 를포함해서간격이일정한 1xn 벡터를생성한다. x = logspace(a,b,n) : 10^a 와 10^b 을포함해서대수적으로간격이일정한 1xn 벡터를생성한다. step 이 1 이면생략가능하고 xmin, step 과 xmax 는수식이되어도된다. 26
2.4 벡터와행렬의입력과조작 2.4.1.1 벡터입력 ( 명령어로생성하기 ) 27
2.4 벡터와행렬의입력과조작 예제 2.1 다음 G(s) 의주파수전달함수의크기를구해보자. 28
2.4 벡터와행렬의입력과조작 2.4.1.2 2 차원행렬입력 ( 직접입력 ) 행렬도벡터와같이변수에원소를할당함으로써생성되고, 그외몇가지방법으로도생성할수있다. 직접입력 : 행렬을직접입력할때에는벡터와같이하면되지만, 행을구분하기위해서는행과행사이에세미콜론 (;) 을두어야한다. 다음은행렬을입력하는예를보여준다. 29
2.4 벡터와행렬의입력과조작 2.4.1.2 2 차원행렬입력 ( 명령어로생성하기 ) 명령어로생성하기 : 원하는행렬을명령어로만드는것자체가쉬운일은아니지만행렬이특수한형태인경우에는 Matlab 에서제공하는내장함수를활용하면쉽게만들수있다. zeros(n), zeros(n,n) : 모든원소가 0 인 n x n 행렬을생성한다. ones(n), ones(n,n) : 모든원소가 1 인 n x n 행렬을생성한다. eye(n), eye(n,n) : n x n 항등행렬을생성한다. B = reshape(a,n,m) : p x q 행렬을 n x m 행렬로재정렬시킨다. 단두행렬의원소개수가같아야한다 ( 즉 pq = nm). 30
2.4 벡터와행렬의입력과조작 2.4.1.2 2 차원행렬입력 ( 명령어로생성하기 ) 31
2.4 벡터와행렬의입력과조작 2.4.1.2 2 차원행렬입력 ( 행렬정보얻기 ) 행렬의차원, 원소의개수등과같은정보를얻는명령어는다음과같다. size(a) : 행렬 A의행과열의크기를알려준다. size(a,1) : A의행의크기를알려준다. size(a,2) : A의열의크기를알려준다. length(a) : A의행또는열의크기중큰값을알려준다. numel(a) : A의원소의개수를알려준다. 32
2.4 벡터와행렬의입력과조작 2.4.1.2 2 차원행렬입력 ( 행렬정보얻기 ) 33
2.4 벡터와행렬의입력과조작 2.4.2.1 부분배열생성하기 변수가정의되면그이후에배열크기나유형을마음대로바꿀수있다. 예로스칼라를벡터나행렬로바꾸거나, 벡터를스칼라나행렬로, 또행렬을스칼라나벡터로바꿀수있다. 이러한변형은원소를더하거나, 삭제하거나또어떤범위의원소를취함으로써이루어진다. 벡터내의어떤범위의원소들을선택할경우에는다음과같이콜론 (:) 을사용하면된다. end 는마지막원소의위치를의미한다. x(:) : 모든원소를선택한다. x(n:m) : n 번째부터 m 번째까지의원소를선택한다. x(end) : 마지막원소를선택한다. 34
2.4 벡터와행렬의입력과조작 2.4.2.1 부분배열생성하기 행렬의경우에도콜론 (:) 을사용하면된다. end 는행과열의마지막원소의위치를나타내준다. A(n, :) : n 번째행에속한모든열의원소를선택한다. A(:, m) : m 번째열에속한모든행의원소를선택한다. A(n1:n2, :) : n1~n2 번째행에속한모든열의원소를선택한다. A(:, m1:m2) : m1~m2 번째열에속한모든행의원소를선택한다. A(n1:n2, m1:m2) : n1~n2 번째행과 m1~m2 번째열에속한모든원소를선택한다. 35
2.4 벡터와행렬의입력과조작 2.4.2.1 부분배열생성하기 36
2.4 벡터와행렬의입력과조작 2.4.2.2 원소수정및제거하기 만약벡터나행렬의특정위치의원소를수정할경우에는아래와같이입력하면된다. 벡터의특정위치의원소를제거하려면빈대괄호 ([ ]) 를입력하면된다. 37
2.4 벡터와행렬의입력과조작 2.4.2.2 원소수정및제거하기 행렬의특정위치의원소를제거할때에는다음과같이입력하면삭제되고, 차원이줄어든다. 38
2.4 벡터와행렬의입력과조작 2.4.2.3 원소추가하기 벡터의길이를넘어서는위치의원소에새로운값을할당하면확장된벡터를만들수있고, 마지막원소와새원소사이에는 0 이할당된다. 39
2.4 벡터와행렬의입력과조작 2.4.2.3 원소추가하기 같은차원의두벡터를결합해서다른길이의벡터를만들수있고또같은차원의두벡터를결합해서행렬을만들수있다. 40
2.4 벡터와행렬의입력과조작 2.4.2.3 원소추가하기 행렬의차원을넘어서는위치의원소에새로운값을할당하면새로운행과열이추가되고, 나머지추가된원소에 0 이할당된다. 행렬에열벡터를추가할때에는세미콜론 (;) 으로분리한다음적어주면되고, 행벡터를추가할때에는뒤에추가해주면된다. 이때추가되는행이나열의길이가행렬의행또는열의길이와같도록해주어야한다. 41
2.4 벡터와행렬의입력과조작 2.4.2.3 원소추가하기 어떤행렬의행에다른행렬을추가할때에도세미콜론 (;) 으로분리한다음적어주면되고, 열에추가할때에는뒤에추가해주면된다. 이때추가되는행이나열의길이가행렬의행또는열의길이와같아야한다. 42
2.4 벡터와행렬의입력과조작 예제 2.2 0 t 4π 동안 sin(t) 와 cos(t) 의그래프를그려보자. 43
2.4 벡터와행렬의입력과조작 2.4.3.1 문자열의조작 앞서변수에는문자열을저장할수있고또문자열은작은따옴표 ( ) 안에문자, 숫자, 기호와공백의조합으로표시될수있음을간단히살펴보았다. 문자열도대괄호 ([ ]) 와세미콜론 (;) 을사용하여한문자열에다른문자열을추가시킬수있다. 44
2.4 벡터와행렬의입력과조작 2.4.3.2 문자열의삭제 문자열내의임의문자를삭제할때에는아래와같이빈대괄호 ([ ]) 를입력하면삭제되고, 문자열의길이는제거한문자수만큼줄어든다. 45