Notice
Recent Posts
Recent Comments
Link
관리 메뉴

뛰는 놈 위에 나는 공대생

[MATLAB] 사용자 정의 함수 (로컬 함수, 중첩 함수, 익명 함수, 프라이빗 함수) 본문

프로그래밍 Programming/매트랩 MATLAB

[MATLAB] 사용자 정의 함수 (로컬 함수, 중첩 함수, 익명 함수, 프라이빗 함수)

보통의공대생 2022. 5. 17. 17:07

 

키워드 : 로컬 함수, 중첩 함수, 익명 함수, 프라이빗 함수

 

 

MATLAB에 기본적으로 만들어져있는 내장함수도 많지만 본인이 직접 원하는 함수가 필요할 때가 있다.

예를 들어 내가 아는 $f(x)=x^{3}+x^{2}+x+3$ function이 있을 때 이를 symbolic function으로 정의해서 대입하기 보다는 사용자 정의 함수를 만들어서 그 함수에 대입을 하고 return을 받는 것이 코드 속도가 훨씬 빠르기 때문이다.

 

사용자 정의 함수를 만드는 방법은 크게

 

1. .m 코드 내에서 function을 만드는 방법

2. function을 단독으로 하는 .m 코드를 만드는 방법

 

으로 분류할 수 있다.

 


1. 실행 코드 내에서 function을 만드는 방법

 

1번 방법 먼저 살펴보자.

 

 

1) 익명함수

간단한 방법으로 익명함수가 있다.

 

sqr = @(x) x.^2;
a = sqr(5)

 

특별히 따로 function을 정의하기 번거롭고 단순한 식일 때는 익명함수를 쓰는 게 낫다.

위의 코드를 사용하면 5를 제곱한 25가 a에 들어가게 된다.

 

@() 괄호 안에는 입력으로 넣을 변수를 표시한다.

흥미로운 사실은 다음과 같은 코드도 가능하다는 것이다.

 

a = 10;

sqr = @(x) a*x^2 ;

 

a에 특정 값을 대입하고, 이를 함수에 활용할 수 있다. 나중에 a를 다른 숫자로 바꾼다해도 sqr에는 영향을 주지 않는다.

 

 

2) 인라인 함수 (Not recommended)

 

최근 MATLAB help 문서를 보면 권장하지 않는다고 나와있다. 방법만 보이고, 웬만하면 쓰지 말자. 보통 MATLAB이 쓰지 말라는 데에는 이유가 있다...

g = inline('sin(alpha*x)','x','alpha')
g(2,0.1) % input is 'x' and 'alpha'

 

3) 로컬 함수

 

코드 상에서 긴 함수를 넣고 싶을 때는 코드 맨 밑에

 

function [return] = function_name(input)

	return = input * 2
    
end

이런 식으로 작성할 수 있다.

 

무조건 함수는 코드의 맨 밑에 써야한다. 함수가 여러 개라면 밑에 여러개를 동시에 쓰면 된다.

 

return은 내가 반환할 값을 말하고 꼭 return이라고 쓸 필요 없이 코드 상에서 반환하고 싶은 변수를 적는다.

 

변수는 여러 개가 될 수 있다. 예를 들어

 

[r1, r2] = arb_func(2) ;
[~,r2] = arb_func(2) ; % ignore first return


function [return1, return2] = arb_func(a)
	return1 = a^2 ;
    return2 = a*2 ;
end

아래처럼 return은 2개인데, '~'를 사용해서 return을 무시할 수도 있다.

 

 

2. Function을 단독으로 하는 .m 코드를 만드는 방법

 

1) 만드는 방법

따로 function을 정의한 .m 코드를 만든다. 이 때 주의할 점은

 

1. .m 코드를 함수를 호출하는 코드와 같은 경로에 넣어야 한다.

이 때 경로를 바꿔서 따로 함수 코드를 넣고 싶다면 함수를 호출하는 코드에서 경로를 추가해줘야한다. (MATLAB의 addpath 사용)

 

2. .m code의 이름은 반드시 작성한 함수의 이름을 사용해야 한다. 예를 들어

 

function b = myfunction(a)
   b = squareMe(a)+doubleMe(a);
end

이 함수를 사용하고자 한다면, myfunction.m으로 저장한다.

 

 

2) 부함수 Subfunction (+ 로컬함수 Local function)

이 function에서 subfunction을 만들거나 nested function을 포함할 수도 있다.

 

function b = myfunction(a)
   b = squareMe(a)+doubleMe(a);
end
function y = squareMe(x)
   y = x.^2;
end
function y = doubleMe(x)
   y = x.*2;
end

위의 예시를 보면 myfunction이 main function, 메인함수이고 그 안에 로컬 함수인 squareMe와 doubleMe가 있다. 이걸 subfunction이라고도 할 수 있을 것이다. 이 두 함수는 로컬 함수이기 때문에 myfunction.m 코드 밖에서는 접근이 불가능하다.

 

3) 중첩함수 Nested function

 

또는 함수 안에 아예 함수를 또 포함하는 경우가 있는데 이 때는 인자를 특정해서 입력하지 않아도 된다는 장점이 있다고 한다.

function myslider
value = 0;
f = figure;
s = uicontrol(f,'Style','slider','Callback',@slider);
e = uicontrol(f,'Style','edit','Callback',@edittext,...
                'Position',[100,20,100,20]);

   function slider(obj,~)
      value = obj.Value;
      e.String = num2str(value);
   end
   function edittext(obj,~)
      value = str2double(obj.String);
      s.Value = value;
   end

end

 

 

위 코드를 보면 e와 s를 특정하게 적지 않고 e, s를 function slider와 edittext 안에서 쓸 수 있다.

 

 

4) 프라이빗 함수 Private function

프라이빗 함수는 함수의 범위를 제한해야 할 때 유용합니다. 
private이라는 이름의 하위 폴더에 함수를 저장하여 프라이빗으로 지정할 수 있습니다. 그러면 private 하위 폴더 바로 위 폴더의 함수 및 스크립트에서만 이 함수를 사용할 수 있습니다.

프라이빗 함수에 대한 내용은 MATLAB help center에 다음과 같이 나와있다. 내가 저장한 코드가 포함된 폴더 안에 private이라는 하위 폴더를 만든다. 그 폴더 안에 함수 코드에서 프라이빗 함수를 호출하면 작동한다.

 

 

 

이렇게 private 폴더를 만들었고 그 안에 findme 코드가 있다.

 

function findme
% FINDME  An example of a private function.

disp('You found the private function.')

이 코드는 화면에 'You found the private function'이라는 글을 출력하는 코드이다.

 

function visible
findme

그리고 visible.m 코드는 findme를 호출하는 코드이다.

 

따라서 

visible.m 코드가 있는 폴더로 경로를 바꾸고

visible 코드를 실행하면 private 폴더에 있는 findme를 실행되고 'You found the private function'라는 글이 출력된다.


참고 자료

https://kr.mathworks.com/help/matlab/matlab_prog/anonymous-functions.html?searchHighlight=%ED%95%A8%EC%88%98&s_tid=srchtitle_%25ED%2595%25A8%25EC%2588%2598_1 

 

익명 함수 - MATLAB & Simulink - MathWorks 한국

이 예제의 수정된 버전이 있습니다. 사용자가 편집한 내용을 반영하여 이 예제를 여시겠습니까?

kr.mathworks.com

http://ssjarng.chosun.ac.kr/matlab/chapter06.pdf

https://kr.mathworks.com/help/matlab/matlab_prog/types-of-functions.html?searchHighlight=%ED%95%A8%EC%88%98&s_tid=srchtitle_%25ED%2595%25A8%25EC%2588%2598_6 

 

함수의 유형 - MATLAB & Simulink - MathWorks 한국

이 예제의 수정된 버전이 있습니다. 사용자가 편집한 내용을 반영하여 이 예제를 여시겠습니까?

kr.mathworks.com

 

Comments