공학컴퓨터활용입문 강의 4: Matlab 사용법 충남대학교메카트로닉스공학과
2.8 입출력하기 2.8.1 입력명령어 키보드로부터데이터를입력받을때사용하는명령어로는 input 이있으며그형식은다음과같다 (interactive programming). var = input( Enter var : ) 명령어가실행되면 Enter var : 가화면에나타나며, 데이터를입력하고 <Enter> 키를누를때까지기다린다. <Enter> 키를누르면입력한값이 var 에할당된다. 2
2.8 입출력하기 2.8.2 출력명령어 앞서살펴보았듯이명령어끝에세미콜론 (;) 을생략하고 <Enter> 키를누르면자동적으로그결과를화면에표시해준다. Matlab 이제공하는기본설정에의하면변수값은소수점이하 4 자리수의고정소수점으로표시해주지만 format 명령어로변경할수있다. format short : 소수점이하 4 자리수의고정소수점으로표시해준다. format long : 소수점이하 15 자리수의고정소수점으로표시해준다. 3
2.8 입출력하기 2.8.2.1 화면출력 자동출력기능외에화면출력을해주는명령어로 disp 와 fprintf 가있다. disp(var) : var 의값을기본설정으로화면에출력해준다. fprintf( format, var1, var2) : 두변수 var1, var2 를지정된형식으로화면에출력한다. fprintf 명령어를사용할때형식지정은작은따옴표 ( ) 안에두며다음세요소들의결합으로된문자열이다. 1) 연산자 %w.pc : 퍼센트기호 (%) 로시작하고변환문자 c 로마친다. w 는필드폭을, p 는소수점이하의자리수를의미한다. 자주사용되는변환문자는다음과같다. d 또는 i : 정수형 (32 비트 ) e : 지수형 ( 예, 1.123456e+0.01) f : 고정소수점형 ( 예, 123.45678) s : 문자열형 4
2.8 입출력하기 2.8.2.1 화면출력 2) 출력될문자 3) 이스케이프문자 : 다음문자를포함하며더자세한것은도움말창에서찾을수있다. \n \a \b : New line : Alarm : Backspace 5
2.8 입출력하기 2.8.2.1 화면출력 변수가배열일경우에 Matlab 은첫째열, 둘째열,, 마지막열순으로원소들을차례로출력해주기때문에사용시주의해야한다. 6
2.8 입출력하기 2.8.2.1 화면출력 앞선예시에서원래의 buf 와같은모양으로출력하려면아래와같이하면된다. 7
2.8 입출력하기 2.8.2.2 파일에데이터저장하기 fprintf 명령어는값을화면엔출력해주는것외에도파일에저장하는데도사용할수있으며, 저장된파일은추후다른프로그램에서불러사용할수도있다. fprintf 명령어로값을파일에저장할경우에는 fopen, fclose 명령어와함께쓰이며이들의형식은다음과같다. 8
2.8 입출력하기 2.8.2.2 파일에데이터저장하기 자주사용되는 permission 코드는다음과같다. r : 읽기파일을연다 ( 기본설정 ) w : 쓰기파일을연다. 파일이없으면새로만들고, 파일이존재할경우에는기존의저장된내용들이삭제된다. a : 기존의파일을열어그끝에추가한다. 새로운파일 fname3 에 x, y, z 세데이터를저장하고확인해주는예 9
2.8 입출력하기 2.8.2.3 파일에서데이터읽기 형식을갖춰파일에저장된값은 fopen, fclose 명령어와함께 fscanf 명령어로읽을수있다. fscanf 의형식은다음과같다. 자주사용되는 filterspec은다음과같다. *.dat : 확장자 dat를가지는파일 *.m : 확장자 m을가지는 m-파일 *.* : 모든파일 10
2.8 입출력하기 2.8.2.3 파일에서데이터읽기 다음은 3x4 난수를발생시켜 fname4 파일에저장하고, 다시저장된데이터를읽는예를보여준다. 11
2.8 입출력하기 2.8.2.3 파일에서데이터읽기 다음은다이얼로그박스에서선택한파일명으로부터데이터를읽어화면에보여주는예이다. 만약다이얼로그박스에서 fname4.dat 를선택한다면실행된결과는위의경우와같게된다. 12
2.9.1 함수 m- 파일 수식이나알고리즘의전부또는일부를모듈화하여반복적으로사용할필요가있다면사용자정의함수를만들어놓으면큰도움이된다. 사용자정의함수란사용자가함수형태로작성해놓은프로그램을말하며이를파일에저장한것을함수 m- 파일이라한다. 2.9.1.1 함수의형식 함수는첫실행문이 function 으로시작되며그형식은출력인수, 등호, 함수명과입력인수순으로되어있다. 입력인수는외부프로그램으로부터함수내로데이터를받는역할을해주고, 출력인수는계산된결과를함수밖으로전달하는역할을해준다. 13
2.9.1.1 함수의형식 함수작성시유의사항은다음과같다. 1) 함수는입력인수와출력인수를전혀갖지않거나, 하나또는여러개를가질수있다. 2 개이사이면콤마로구분하고나열하면된다. 2) 만약입력인수를갖지않을때에는 (in_arg1, in_arg2) 를, 출력인수를갖지않을때에는 [out_arg1, out_arg2] = 를생략하면된다. 또출력인수가 1 개뿐일때는대괄호 ([ ]) 없이나타낼수있다. 3) 출력인수들을가질경우에는이들은함수프로그램내에서반드시값을할당받아야한다. 4) 함수를파일에저장할때에는파일명이함수명과서로같도록저장해줘야추후에함수명으로함수를호출할수있다. 14
2.9.1.1 함수의형식 벡터놈은스칼라이며다음식으로정의되기도한다. 이를계산해주는함수를 Matlab 내장함수 norm 과중복이되지않도록함수명을 MyNorm 으로, 입력인수를 x, 출력인수를 xnorm 으로하여작성해보면다음과같다. 15
2.9.1.1 함수의형식 출력인수를둘필요가없는예시 입력인수를둘필요가없는예시 16
2.9.1.2 함수파일의저장 저장버튼또는 < 저장 > < 다른이름으로저장 > 을누르면파일명을입력하라는별도의창이나타나며, 여기에입력하고아래쪽 < 저장 > 을누르면저장된다. 이때파일명은함수명과일치되게해줄필요가있다. 새함수를저장할때에는함수명이자동으로박스에나타나므로 < 저장 > 버튼을누르기만하면된다. 사용자가별도로폴더를지정하지않으면현재의폴더에저장된다. 일반적으로함수파일에는함수하나만담는것이보편적이지만, 예속된함수가있을때는이들을묶어한파일에담을수도있다. 파일하나에여러개의함수들이존재할때에는맨앞에오는함수를주함수라하고나머지함수들을부함수라한다. 주함수는명령창이나스크립트나외부함수에서불러쓸수있지만, 부함수는파일내의주함수와다른부함수에서만호출될수있고순서와는상관없이작성하면된다. 파일을저장할때에는파일명이주함수명과일치되도록해야한다. 17
2.9.1.3 함수의호출 함수를만들어파일에저장해놓으면사용자는이를내장함수 (cos, sqrt, exp 등 ) 와같이불러쓸수있다. 함수호출은명령창이나스크립트또는다른함수에서할수있으며, 입출력인수를준비해서함수명으로호출하면제어권이피호출함수 ( 호출되는함수 ) 로넘어가게된다. 피호출함수에서실행이완료되면제어권은다시호출한스크립트나함수내의다음명령으로넘어가게된다. 함수호출문과피호출함수에서사용하는입출력인수명은서로달라도상관없고, 함수파일은현재의작업폴더에저장되어있든지아니면저장된경로가설정되어있어야한다. 18
예제 2.14 벡터 x = [2 4 1 0 5 2] 를입력받아평균 (ave) 과표준편차 (dev) 를계산해주는함수를작성하고호출해보자. 19
예제 2.15 x-y 좌표계상의좌표 (x0, y0) 은원점을기준으로축을반시계방향으로 θ 만큼회전시킨새로운 x -y 좌표계에서는 (x, y) 로표시되며관계식은다음과같다. (x0, y0) 와 θ 를입력받아 (x, y) 로변환해주는함수파일을작성하고호출해보자. 20
예제 2.16 중심이 (x0, y0) 이고반경이 r 인원을그릴때극좌표와직교좌표간의관계식은아래와같다. 중점 (x0, y0) 와반경 r 을입력받아원의좌표벡터 (x, y) 를생성해주는함수를작성하고호출해보자. x = x0+rcos(θ) y = y0+rsin(θ) (0 θ 2π) 21
2.9.1.4 지역변수와전역변수 Matlab 은명령창과스크립트파일이사용하는메모리영역인작업공간과는별도로함수를위해분리된메모리영역을지정하는데, 이런분리된메모리영역을사용하는함수내의모든변수들을지역변수라한다. 함수는입력인수를통해값을전달받고, 전달받은값과함수내에서정의되는변수를써서구한결과값을출력인수를통해전달하고실행을종료한다. 함수가종료될때사용되었던모든변수들의메모리는해제되고운영체제에반납된다. 이때문에작업공간과함수, 함수와다른함수간에는서로사용중인변수를인식하지못하므로 ( 접근이불가능함 ) 호출함수와피호출함수의변수명이서로달라도상관없다. 22
2.9.1.4 지역변수와전역변수 23
2.9.1.5 영구변수 함수내에서사용되는지역변수들은제어권이호출함수로넘어갈때모두지워지므로특정변수들을지우지않고계속사용하고싶을때에는다음형식으로영구변수로선언해주면된다. persistent var1 var2 var3 이렇게선언하면 var1, var2, var3 변수는저장공간에서파일이지워질때까지남아있게된다. 호출함수에서영구변수내용을삭제하고싶을때에는 clear 명령어로피호출함수명을지워주면된다. 24
예제 2.17 다음은간단한 IIR 저역통과필터식이다. 입력 x(k) = cos(2πfk)+n(k) 를받아필터링해주는함수 MyFilter 를작성하고호출해보자. 여기서 f=0.5[hz] 이고, n(k) 는평균이 0 이고분산이 0.01 인정규잡음이다. y(k) = 0.1584y(k-1)+0.4208x(k)+0.4208x(k-1) 25
2.9.2 익명함수 Matlab 은수식이간단한경우에별도의파일에저장하지않고문장속에한줄로간결하게정의해서사용할수있는익명함수를가지고있다. 사용법은다음과같으며, arg1, arg2 는입력인수, f 가출력인수이고 expression 은수식을의미한다. f = @(arg1, arg2) expression 아래식과같이배열연산을써서프로그래밍해두면스칼라, 벡터둘다적용할수있다. 26
2.9.3 함수함수 어떤함수가변수뿐만아니라함수명을인수로가질때이를함수함수라부른다. Matlab 을쓰다보면이런형태의함수함수들을종종접하게된다. 이들은대부분사용자로부터함수를제공받아야만문제해결이가능하다. 2.9.3.1 함수함수의형식 함수함수의형식은앞서살펴보았던함수의형식과유사하지만, 입력인수로다른함수명을가진다는점이다르다. 여기서 fun 은사용자정의함수와익명함수또는 Matlab 에서제공하는내장함수가될수있다. 27
2.9.3.2 함수핸들 함수핸들은관련된함수를간접적으로호출하기위해 Matlab 에서사용되는데이터형식중하나이다. 함수핸들은사용자정의함수와익명함수또는내장함수를함수함수에전달해줄뿐만아니라, 변수에할당되어이후의프로그램에서사용되기도한다. handle = @functionname % 사용자정의함수또는내장함수 handle = @(arg1, arg2) expression % 익명함수 사용자정의함수와 Matlab 내장함수는함수명앞에기호 (@) 를두면함수핸들이만들어지고, 이들은다음과같이변수에할당될수있다. myfun = @fun; cosfun = @cos; 그러나익명함수의경우익명함수이름자체가함수핸들이기때문에따로 @ 를더둘필요가없다. 28
2.9.4.1 입출력인수의수 함수는입출력인수를가지며, 호출함수와피호출함수간에는이들인수를통해데이터를전달하고전달받게된다. 실제프로그래밍환경에서는호출함수의입출력인수수가피호출함수의입출력인수수보다적을수도있다. 피호출함수의입출력인수의전부, 일부, 또는아무것도갖지않고호출될수도있다. 피호출함수의입장에서호출함수로부터몇개의입력인수가전달될지또호출함수에는몇개의출력인수를전달해야할지알필요가있을때사용하는명령어가 nargin 과 nargout 이다. nargin : 호출함수로부터전달되는입력인수의수를반환한다. nargout : 호출함수에전달해줄출력인수의수를반환한다. 29
2.9.4.1 입출력인수의수 30
2.9.4.1 입출력인수의수 31
2.9.4.2 가변입출력인수 가변입력인수와가변출력인수는함수에서선언되는인수로서그길이가가변되는특징을갖는다. 이들은입출력인수의수에제한이없는함수를만들때흔히쓰이며, 명시적으로선언되는인수들다음에와야하고, 내부적으로는셀배열형태로전달된다. 그사용형식은다음과같다. 추가할명시적입출력인수가더있으면가변입출력인수앞에콤마를두고나열하면된다. 32
2.9.4.2 가변입출력인수 33
2.9.4.2 가변입출력인수 34