본문으로 바로가기

[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개인 경우에 따라 그 결과가 다르다는 것을 확인할 수 있습니다.^^

신고