ef84d281ed8584d2f5a0ce13f190d6fc.jpg

안녕하세요? LGS입니다. 날씨가 많이 쌀쌀하군요. 감기조심하시구요~
강의를 바로시작하도록하겠습니다. 오늘은 이때까지 갈고 닦은 내공으로 함수(Function)을 한번 만들어 보겠습니다. 
마구 설래이죠? ㅋ

Rpl2jIHFfHPCxZiaHa1ig3lnqfKlOTVYGHOZBNNBMFRkikaaoDdoqcvIJUCcMUvl3pSiHS7KvdbvSwqBrvD00MU0o-NDedWDiVzMsB8BHzdJzNvfofM

MATLAB에서 사용하는 함수들은 하드디스크에 저장되어 있습니다. 
저장되어있는 파일의 확장자는 .m 이고요 보통 M-file이라고 부릅니다.  
지난 시간에 사용한 magic이나 pascal도 하드디스크에 magic.m  pascal.m으로 저장되어 있단 말이죠.

사실 M-file(확장자가 .m인 파일)에는 두가지 종류가 있습니다.
그 두가지가 무엇인고 하니 바로 바로 바로 스크립트(script) M-file과 함수(function) M-file이 되시겠습니다. 
함수는 다 아실테고 그럼 스크립트가 뭐냐? 한마디로 말하자면 스크립트는 Command Window의 확장입니다.

지난 강의에서 함수가 공장과 비슷하고 입력변수를 입력받아서 출력값을 반환한다고 했죠? 
그런데 이 스크립트라는 놈은 입력변수도 없고 출력변수도 없습니다. 
대신에 Command Window 사용하는 것 처럼 Workspace에 있는 변수들을 그냥 바로 가져다 쓸수 있고, 
스크립에서 만들진 변수는  Workspace에 그대로 저장되어 남습니다. 
왜냐면 스크립트는 Command Window의 확장이니까요. 
즉 스크립트라는 놈은 스크립트에 있는 명령들이 차례대로 Command Window에서 실행된다고 생각하시면 됩니다.

그에 반해 함수는 입력변수를 입력받아 딸랑 출력값만 Workspace로 출력합니다. 
함수 내부에서 지지고 볶든 말든 출력되는 값은 딸랑 출력값 하나입니다. 
지역변수(함수 내부에서 쓰이는 변수들)는 출력이 되지않습니다.

스크립트와 함수의 차이가 이해가 가시나요? 백문이 불여일견!! 직접해봅시다.

pQh66qZbCsAen4iaW1W4UAYHDseuGVU_Dn-HwfO8UWM_jZCPxJgEPsZO9hkiJALJDGABsdrLMbM2AcHoADUfIWclWcJm5R85JlymKKoNvxaqfNZ6OBk



New M-File 버튼을 눌러서 m-file을 하나 만듭니다. 또는 Command Window에 >>edit 라고 입력해도 Editor창이 뜹니다. 

(메뉴에서 File -> New -> Blanck M-File을 클릭하셔도 됩니다)

6WVOrXLXZLWB9npV3oYjX9UzFlqVPLe3CzwTv71G2QOVMMBwRvqT6u2oc2GVTy0lwc3NR4Gs8jCFZqkNlAcf6JOgGR3c46fBLk_9_NJIK_FCvpKa9r0


짜잔~ 그러면 우리가 직접 Coding할 수 있는 Editor가 요롷게 뜹니다. 

Editor의 버튼들과 메뉴들을 그냥 한번 훑어 보세요.
Editor 에서 가장 많이 사용하는 버튼은 녹색화살표 모양인 Save and Run입니다. 
단축키가 F5 라는 정도만 외워둬도 편리하게 사용 할수 있습니다.

A=1;
B=2;
C=A+B;

라고 Editor에 쳐넣어 보세요. 그리고 녹색화살표 버튼!! test.m으로 저장하시구요. 
자 다시 MATLAB의 Command Window로 돌아가 봅시다.
오홋!! Workspace에 A,B,C가 생겼군요. 정말 그냥 Command Window에 놀때와 다른 것이 없습니다. 

Command Window에서 직접 
>>A=1;
>>B=2;
>>C=A+B;
이라고 입력하는 것과 test.m은 정확히 같습니다.

변수 C를 계산할 때 변수 A와 변수 B를 따로 입력받지 않고 Workspace의 A,B를 바로 가져와서 사용했습니다. 
이것이 스크립트 입니다. 저장된 스크립트를 실행 시키고 싶으시다면 Command Window에서 
확장자 .m을 제외한 저장한 파일 이름을 입력하면 스크립트가 실행됩니다.

>>clear
>>test


다음으로 함수에 대해서 이야기 해봅시다.
새로 M-File을 하나 만들어서 Editor에 아래와 같이 입력해보세요.

%vsum 내가 처음으로 만든 함수
function s = vsum(a,b)
    c= a - b;
    s= a + b;  %s만 출력됩니다.

둘째 줄의 파란색 'function'은 이 M-File이 스크립트가 아니라 함수라는 것을 MATLAB에게 알려줍니다. 
스크립트에서는 'function' 같은 건 안썼죠. 
s는 출력변수의 이름입니다. 즉 함수 내부에서 쓰이는 수많은 변수들 중에 s만을 출력값으로 돌려준다는 말입니다. 
함수 내부적으로는 c와 s라는 변수가 생겼지만 이 둘중에 오직 출력변수로 설정된 s만을 함수 외부로 표현한다는 말이죵!! 
함수의 사용이 종료되면 내부변수인 c와 s도 사라지게 됩니다.(Workspace에 남지 않음)
vsum은 함수의 이름, a,b는 입력변수가 되겠군요.(입력변수가 둘이상이면 콤마(,)로 구분해줍니다) 형식은

function 출력값 = 함수명(입력변수)

이런식입니다. 
녹색으로 된 부분이 보이시나요? M-File에서 %는 주석(설명하는 글) 입니다. 
1줄에 한하여 %뒤에 쓰인 글은 설명으로 간주하고 모두 무시가 됩니다. 

함수는 (주의!!)함수의 이름과 파일의 이름이 반드시 같아야 합니다.
함수의 이름이 vsum이었으니까 vsum.m으로 저장하신 다음 Command Window로 돌아가 봅시다.

>> d = vsum(1,2)
d =
      3
위의 식을 풀어써보면 'vsum이라는 함수에 입력변수로 1,2를 입력하고(a=1,b=2) 
출력변수로 지정된 변수(s)의 값을 d에 저장하라'라는 말입니다. 이해되시죠?

>> open magic
그럼 이제 magic 함수의 첫줄에 나와있는 function M = magic(n) 의 의미를 읽으실 수 있겠죠?
 그리고 밑에 %로 설명문(주석)이 달려 있군요. 이때까지 신나게 help를 사용해왔는데 
사실 help를 치면 함수에서 첫부분의 %로 연속처리 되어있는 부분을 출력해주는 겁니다. 
두말 안해도  주석은 매우 중요하겠죠? 
lookfor는 모든 함수에서 주석문에 찾고자 하는 단어가 들어있는  함수목록을 보여줍니다.

>>help vsum
    내가처음으로 만든 함수

자~ 그럼 우리가 저장했던 M-File은 어디에 저장되어 있을까요? MATLAB의 상단 가운데 쯤에 Current Directory가 보이시나요?
Current Directory, 말그대로 지금 우리(MATLAB이)가 사용하고 있는 폴더가 되겠습니다.
 우리가 방금 만들었던 스크립트와 함수는 기본적으로  이 Current Directory에 저장이 됩니다.
 어라? 그런데 Current Directory에는 magic.m 안보이는데 어떻게 magic이라는 함수를 불러오지??(오!~ 예리하시군요)
Command Window에서 MATLAB이 magic 함수를 만나면 MATLAB은 
우선적으로 Current Directory에서 magic 함수를(magic.m을) 찾아봅니다.
 Current Directory에서 함수를 찾아 봤는데 magic이란 이름의 함수가 없다, 
그러면 Set Path에 저장되어있는 폴더에서 순서대로 함수를 찾게 됩니다. 
메뉴에서 File -> Set path를 클릭해보시면 Path가 걸려있는 폴더를 보실 수 있습니다.(또는 >>path) 
물론 여러분들이 Path를 추가하실 수도 있습니다.

VDL9BFv_ghsssjhSGvWQk2heSDgap6OsFtosIx7UPLVjHo-bnf269LMI_XAHLpEKxPC4hD6fmWQU7gZBeJMLP6mnwRGKiPWPrZ828ClJuClrfD97UiI


그럼 출력값이 2개인 함수는 어떻게 만들까요?? 출력변수를 2개 써주면 되겠죠 뭐~

%두 입력변수의 plus와 minus를 계산함.
function [p m] = plusmin(a,b)
    p = a + b ;
    m = a - b;

plusmin.m으로 저장(Ctrl + S) 하시고 Command Window 에서

>>[a b] = plusmin(5,3)
  a = 
     8
  b = 
     2

출력값이 3개,4개... 문제 없으시죠?
>>c = plusmin(5,3) 도 한번해보시고 어떤식으로 값을 돌려주는지 관찰해보세요.

함수에서 Workspace의 변수들을 입력변수로 입력받지 않고 바로 사용할 수 있는 방법이 없을까요? 당연히 있겠죠 ㅋ
global: 변수를 전역변수로 바꿉니다.
일반적으로 함수에서 Workspace의 변수의 값을 사용하려면 입력변수로 받아야 합니다. 
그런데 이 global이란 놈을 쓰면 함수 내부에서도 Workspace에 있는 변수를 마음대로 가져와 쓸수 있단말입니다. 
예를 들어보겠습니다. 

>>global a; %a를 global로 선언 
>>a=1; 

test.m 함수를 하나만들어 줍니다. 

function s=test() 
   global a; 
   s = a+1; 
   a = 3; 

>>test 
ans = 
      2 
>>a 
a = 
     3 

보통의 경우 함수는 입력변수를 받죠? 
그런데 이 경우 Workspace에 있는 a를 그냥 가져와서 사용했다 이겁니다. test(a)가 아니란 말입니다. 
그리고 원래는 함수 내부의 변수는 Workspace 변수에 영향을 미치지 못하는데 a가 3으로 바꼈군요. 

오늘은 여기까지 입니다. 
자~ 나는 MATLAB으로 함수도 만들줄 안다고 친구에게 가서 우쭐대 줍시다 ^^ 
그럼 다음시간에 뵙겠습니다. 이만 총총..
workspace : 워크스페이스
profile