본문으로 바로가기

[MATLAB 연재] 7. Function 문의 사용

category Software/MATLAB 2010.03.31 14:57
본 강좌에 사용되는 MATLAB은 버젼 7.9.0 (R2009b)을 대상으로 합니다.

소수(prime number) 확인하기 !

먼저 아래 <코드1>을 먼저 보죠

<코드1: test1.m>

testVal = 141;
 
count = 0;
for i=2:testVal
    if mod(testVal, i) == 0
        count = count + 1;
    end
end
 
if count == 1
    disp('Prime number');
else
    disp('NOT prime number');
end

위 코드는 testVal이라는 변수에 저장된 숫자가 소수인지 아닌지를 판단합니다. 소수의 정의는 약수가 1과 자기자신뿐인 숫자를 의미하므로 for문을 이용해서 2부터 자기자신까지 나누어서 나머지(mod)가 0인 경우가 1번뿐이라면 소수라고 판단하는 것입니다. 저 상태로 그대로 실행하면

이라는 결과를 얻을 수 있습니다. 

Funtion 사용!

<코드1>에서 만들었던 부분 중 소수인지 아닌지를 판단하는 구문을 함수화시켜보도록 하겠습니다. 새로운 창을 열고 다음 <코드2>를 작성하면 됩니다.

<코드2: isPrimeNum.m>

function y = isPrimeNum(val)
 
count = 0;
for i=2:val
    if mod(val, i) == 0
        count = count + 1;
    end
end
 
if count == 1
    y = 1;
else
    y = 0;
end

그리고 화일이름은 isPrimeNum.m으로 저장합니다. 이때, 이 화일은 MATLAB이 실행된 current directory에 저장되어있거나 path로 지정되어있어야합니다. 그리고, 다시

<코드3: test2.m>

testVal = 13;
 
temp = isPrimeNum(testVal);
 
if temp == 1
    re = sprintf('%d is prime number', testVal);
else
    re = sprintf('%d is NOT prime number', testVal);
end
 
disp(re)

이라고 작성하면 됩니다. 즉,

 

Current Folder에 위와 같이 화일이 나타납니다. 

<코드2>에서 보면 

function y = isPrimeNum(val)

이렇게 사용하는 것이 function문의 기본 문법입니다. 입력변수는 val, 출력변수는 y라고 지정되어 있습니다. 그리고, 소수이면 1을 반환하고, 아니면 0을 반환하도록 했기때문에 <코드3>과 같이 작성된 것입니다. 

Function에서 help 명령에 반응하기 !

matlab에서 help 명령어 라고 command window에서 입력하면 해당 명령어의 사용법을 알려주는데요. 우리가 작성한 function문도 그렇게 되면 좋겠네요. 시간이 흘렀을때, 기억을 더듬거릴 필요도 없을 것이구요^^ 그 방법은 아래 <코드4>와 같이 하시면 됩니다.

<코드4>

function y = isPrimeNum(val)
 
% y = isPrimeNum(val)
% if val is a prime number, y has 1
% if not, y has 0
 
count = 0;
for i=2:val
    if mod(val, i) == 0
        count = count + 1;
    end
end
 
if count == 1
    y = 1;
else
    y = 0;
end

이렇게 funtion문 아래에 주석(%)으로 문장을 적어두시면, 

command window에서 help명령으로 호출했을때 나타납니다. (영어 울렁증이 있으니, 영어가지고는 뭐라 하지 마시길...ㅜ.ㅜ)

Funtion에서 에러 대비하기 !

소수를 찾는 프로그램을 만들긴 했는데요^^. 이제 기능을 하나더 넣어보도록 하죠. 소수라는건 자연수세계에서만 통하는 이야기니까. 사용자가 잘못된 입력을 사용한 경우 에러메세지를 주도록 한번 해보죠^^

<코드5>

function y = isPrimeNum(val)
 
% y = isPrimeNum(val)
% if val is a prime number, y has 1
% if not, y has 0
 
if (val < 0)
    error('Negative input value')
elseif (val ~= fix(val))
    error('Not interger')
end
    
count = 0;
for i=2:val
    if mod(val, i) == 0
        count = count + 1;
    end
end
 
if count == 1
    y = 1;
else
    y = 0;
end

바로 error라는 명령어입니다. 주어진 메세지를 반환하고 프로그램이 중단되는 것입니다. 딴건 문제가 없으실거고, val~=fix(val)이라고 한 부분은 만약 사용자가 4.3을 입력으로 주었다면, fix(4.3)=4가 되거든요. 그러면, val과 다르다는 것을 알수 있죠. 그래서 사용자의 입력이 정수인지 아닌지를 알게됩니다.

위와 같은 결과를 얻을 수 있는 것이지요^^

nargout을 이용한 출력변수 갯수에 따른 출력형태 변환하기 !

nargout이라는 명령어가 있습니다. 사용자가 함수를 호출할때 출력변수의 갯수를 알려주는 명령어입니다. 마찬가지로 입력변수의 갯수를 알려주는 명령어는 nargin입니다. 이번에는 이 nargout을 이용해서 사용자가 출력변수없이, 즉, 출력변수의 개수가 '0'개이면, 문장으로 이야기하고, '1'개면 '1'혹은'0'을 반환하고, '2'개면, 앞변수에는 숫자를 뒷변수에는 문장을 저장하도록 해 보겠습니다.

<코드6>

function [y, mess] = isPrimeNum(val)
 
% y = isPrimeNum(val)
% if val is a prime number, y has 1
% if not, y has 0
 
if (val < 0)
    error('Negative input value')
elseif (val ~= fix(val))
    error('Not interger')
end
 
count = 0;
for i=2:val
    if mod(val, i) == 0
        count = count + 1;
    end
end
 
if nargout==0
    if count == 1
        disp('Prime Number')
    else
        disp('NOT Prime Number')
    end
elseif nargout==1
    if count == 1
        y = 1;
    else
        y = 0;
    end
elseif nargout==2
    if count == 1
        y = 1;
        mess = 'Prime Number';
    else
        y = 0;
        mess = 'NOT Prime Number';
    end
end

이렇게 출력부분을 조건문으로 만져주면 되겠네요. (단지 nargout을 이야기하는 코드이니 코드가 쓸데없이 비효율적이다고는 말하지 말아주세요^^)

출력 결과입니다. 그냥 isPrimeNum을 사용한 경우와, 변수하나를 두고 사용한경우 2개인 경우에 따라 그 결과가 다르다는 것을 확인할 수 있습니다.^^


댓글을 달아 주세요

  1. BlogIcon 엘리 2010.04.02 01:32 신고

    항상 글 잘 일고 있습니다
    정망 감동 100배 받고 있는데요
    카페 한번 놀러와 주세요 ^^(광고는 아님_부운영자임)
    석사를 가서 제어를 더 공부하고 싶은 학생으로서
    뵙고 싶네요 ㅜㅜ 진짜루요 ㅠㅠ

    • BlogIcon PinkWink 2010.04.02 17:46 신고

      감동이라는 단어까지 선택해주시다늬 오히려 제가 몸둘바를 모르겠습니다. 제어를 전공하실 생각을 하시다니 어려운 선택인데요^^
      그러나 재미는 확실히 있답니다...^^

  2. 엘리 2010.04.03 03:12 신고

    말그대로 그냥 존경합니다 ^^ㅋ
    모든게 설명이 이해하기 너무 쉬어요(어려운것도 있지만 ㅋㅋㅋ 제가 부족해서 ㅜㅜ)

    제어공학책을 다시금 보고 있는데요
    혹시 설계하실떄(로봇) 우선 만들고 나서 작동된 다음 이론을 설립하시나요?
    아님 모터 전달수 부터 구하고 천천히 모든 이론을 검증하시면서 하시나요?

    쿼드 하실때 어떤식으로 설계에 임하셧는지 궁금해요 ㅜㅜ(전 공황 상태;;;;)

    • BlogIcon PinkWink 2010.04.04 04:31 신고

      복합적인데요. 상황에 따라 달라서 ^^
      하지만, 물론 맞고 틀린건 정확히 따지긴 어렵겠지만
      가능하다면.. 먼저 이론을 공부하는 것이 좋다고 항상생각합니다.

      아.. 쿼드의 경우는 원체 인터넷에 많은 자료가 있으니 만드는 것은 어렵지 않은데요...ㅜ.ㅜ
      모터가 사람을 너무 괴롭히네요...ㅜ.ㅜ

  3. BlogIcon 탐진강 2010.04.03 09:29 신고

    주말인데 대자연을 느껴봐요^^;

  4. 은몽가진뇨자 2010.04.03 19:03 신고

    와~ 전혀 알수 없는 언어 같네요. ^^
    님 대단하신거 같아요.
    뭐든...홧팅하세요.ㅎㅎㅎ

  5. 우왕 2010.04.07 02:05 신고

    학부시절에 프로젝트 할때에 필요해서 잠깐 공부하려다.. 그냥 따른 것으로 전환했는데;
    배워두고 싶어 검색하다 들어왔습니다. 프로그래밍은 정말 초보라... 근데도 알아보기가 쉬운듯해요^^ 기초적인것만알아도 실무에 응용이 가능한가요?

    • BlogIcon PinkWink 2010.04.07 11:54 신고

      글쎄요.. 실무라는 것이 어느정도까지를 말씀하시는것인지는 모르겠습니다만... 사실 지금도 꽤 깊숙히 들어와있습니다...^^

  6. lunefey 2010.09.25 18:20 신고

    여쭤볼게 있는데요. cos의 맥클로린 급수를 f(x) 로 하고싶은데요. f(x) = taylor( cos(x) , 5, 0) 으로 해서 f(x) 에 값 넣으면서 다룰라고 하는데 안되네요 ㅠㅠ 어떻게 해야하나요?

    • BlogIcon PinkWink 2010.09.28 13:52 신고

      taylor 명령을 실행하고 싶으신거라면, 그전에 x라는 변수를 정의해 주어야합니다. 여기서는 문자연산을 하고싶은신듯하니

      syms x
      taylor(cos(x),5,0)

      이라고 하시면 됩니다.

  7. lunefey 2010.09.28 21:11 신고

    감사합니당~

  8. 노란튤립 2011.03.29 13:12 신고

    시뮬링크로 조건문을 구현하려고 하면 어떻게 할 수 있을 까요? 매번 변하는 조건으로 계속 반복해서 실행해야 할 때를 구현하고 싶습니다.

  9. 불타는가슴 2011.05.11 16:55 신고

    매번 한단계 한단계 위로 올라갈때마다 제가 알지 못했던 걸

    하나씩 건저가네요 ㅋㅋㅋ 오늘두 잘 보구 갑니다~~

  10. 슈팅스타 2011.05.17 00:34 신고

    Matlab을 갓 입문한 학생입니다.
    과제를 하다가 function문을 작성하는데
    현재 정보와 자료가 부족하여
    어떻게 정의를 내려야 하는지 모르겠습니다.

    일단 문제는
    변수 A를 입력 받아서, A 가 scalar 면 ‘scalar’,
    행벡터 이면 ‘row vector’, 열벡터 이면 ‘column vector’,
    m x n 행렬이면 ‘m x n matrix’ 인 문자열을 출력하는 함수 hw2q3
    인데

    제가 직접 작성한 함수문은
    function [x,y]=hw2q3(A)
    if A=scalar
    disp('scalar');
    elseif A(m,:)
    disp('row vector');
    elseif A(:,n)
    disp('column vector');
    else A=[m, n]
    disp('m x n matrix');
    end

    입니다. 어디가 잘못되었다는 거는 아는데 어떻게 고쳐야 하는지는 모르겠습니다. 조언 좀 얻을 수 있을까요?

    • BlogIcon PinkWink 2011.05.17 07:58 신고

      size라는 함수를 활용해보세요.
      size는 행렬의 크기를 알려주는 함수입니다.
      자세한 내용은 help size를 통해 알 수 있습니다.

      그것을 이용하면
      스칼라인지 열/행 벡터인지 정방행렬인지 등등을 쉽게
      조건문을 걸 수 있을 겁니다.

  11. BlogIcon kks21ckr 2011.06.14 16:24 신고

    질문이 있는데요. fucntion블락이나 embedded 블러게서 코드작성할때
    들어오는 값에 샘플 인덱스값을 어떻게 참조하나요?
    예를들어 a[1,2,3,4]들어오면 a(2)=2잔하요~ 이때 index갑인 2를 참조해야하는데 블락안에선 인덱스값이 안먹히네요.....

    • BlogIcon PinkWink 2011.06.15 08:16 신고

      혹시나 하고 테스트를 해보니...
      되는데요...
      함수의 입력으로 받은 행렬(tmp)에
      함수의 출력으로 tmp(1)이라고 했더니
      첫 숫자가 나오는군요...

  12. 길명 2012.10.13 00:03 신고

    포스팅된 내용 너무 유용했어요 ㅠㅠ
    제가 매틀랩을 막 시작하는 학생인데

    어떤수p의 약수, 약수의 개수, 약수의 합 이걸 프로그램 짜려는데 너무힘드네요

    도와주세요 ㅠ

    • BlogIcon PinkWink 2012.10.19 12:47 신고

      c코드에 보면, 그와같은 예제가 인터넷에 많습니다.
      그걸 살짝 변환하면 되구요.
      약수는 나누어 떨어지는 수이니, 나머지가 0이냐 아니냐를 놓고 반복문을 돌려보면 되지 않을까요?^^

  13. 공학도 2012.11.26 18:23 신고

    function문을 이용하여 QASK, PAM, DM 변조 복조 하는 방법을 공부하는 중인데요..
    어떻게 시작부터 해야할지가 엄두가 안나네요..ㅠㅠ

    • BlogIcon PinkWink 2012.11.29 09:01 신고

      사실.. 질문에 답을 할 수가 없습니다.
      단순히 function의 사용을 문의하시는 거라면, 이 연재를 읽으시면 되고, 나머지 분야는 저도 공부를 해야할 분야인듯합니다.

  14. 공학도 2012.12.04 16:52 신고

    저 죄송한데 요즘 wav파일을 합치는 방법을 공부중인데 어떤 방법이 있을까요?ㅠ

  15. 광양아이 2013.04.02 22:13 신고

    function dy=my_fun(t,y)
    dy=2*t;
    책이 이렇게 나와있어서 했는데
    function 칠때마다 항상 오류나와요
    function 형식대로 하는데도 안되요
    인터넷에 다른것 똑같이 쳐도 안되는 이유가 몰까요?

  16. 몽당연필 2013.10.10 16:52 신고

    항상 강좌 잘 보고 있습니다.
    질문이 있는데요...
    function y = fcn(u)라는 함수를 사용하는데요
    여기서 변수 u는 버튼이 눌리면 1 떼어지면 0인 값이 출력이 되는데요.
    구현하고 싶은 것은 버튼을 누른 만큼의 숫자가 출력되기를 원하는데(한번 누르면 1 또 한번 누르면 2, 즉 누른 횟수)
    증감 연산자도 없고 어떻게 해야할지 감이 안잡히네요 ㅎㅎ PinkWink님 저의 잃어버린 감좀 잡아주세요~ ㅎㅎ

    • BlogIcon PinkWink 2013.10.11 09:08 신고

      http://pinkwink.kr/293
      부터 시작되는 연재에 GUI를 다루고 있습니다. 버튼을 누르는 이벤트 루틴에서 원하시는 코드를 작성하시면 되구요.
      MATLAB에 증감연산자가 없다고 증감을 코딩할 수 없는건 아닙니다.
      a = a +1;
      정도로만 하셔도 증감이지 않나요...

  17. 2017.08.06 19:02

    비밀댓글입니다

    • BlogIcon PinkWink 2017.08.07 07:55 신고

      이 글은 matlab에서 m-file로 만드는 function에 대해 이야기하는 것입니다만...ㅜㅜ
      뭐 그러나 simulink에서도 embedded이든 아니든 어떤 형태로든 m-file로 만들어진 fcn을 호출할 수 있긴 합니다.
      그리고.. 함수(funciton)의 존재 이유를 물으신다면... 그 설명은
      http://www.hackerschool.org/Sub_Html/HS_University/BOF/essential/PDF_Files/07.pdf
      를 읽어보시는 것을 추천합니다.