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

2022. 5. 17. 17:07·프로그래밍 Programming/매트랩 MATLAB

 

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

 

 

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

 

저작자표시 비영리 변경금지 (새창열림)

'프로그래밍 Programming > 매트랩 MATLAB' 카테고리의 다른 글

[MATLAB] 유용한 디폴트 default 속성 명령어 저장  (0) 2022.06.05
[MATLAB] 3D plot을 그릴 때 주의할 점 : X,Y축 반전  (2) 2022.05.20
[MATLAB] 그래프 제목에 LaTeX를 쓰고 싶을 때  (0) 2022.05.08
[MATLAB] Symbolic 식에서 복잡한 숫자로 된 분수를 소수로 바꾸기  (0) 2022.04.07
[MATLAB] Figure 그릴 때 유용한 명령어 및 기능 모음  (0) 2022.02.24
'프로그래밍 Programming/매트랩 MATLAB' 카테고리의 다른 글
  • [MATLAB] 유용한 디폴트 default 속성 명령어 저장
  • [MATLAB] 3D plot을 그릴 때 주의할 점 : X,Y축 반전
  • [MATLAB] 그래프 제목에 LaTeX를 쓰고 싶을 때
  • [MATLAB] Symbolic 식에서 복잡한 숫자로 된 분수를 소수로 바꾸기
보통의공대생
보통의공대생
수학,프로그래밍,기계항공우주 등 공부하는 기록들을 남깁니다.
  • 보통의공대생
    뛰는 놈 위에 나는 공대생
    보통의공대생
  • 전체
    오늘
    어제
    • 분류 전체보기 (458)
      • 공지 (1)
      • 영어 공부 English Study (40)
        • 텝스 TEPS (7)
        • 글 Article (21)
        • 영상 Video (10)
      • 연구 Research (99)
        • 최적화 Optimization (3)
        • 데이터과학 Data Science (7)
        • 인공지능 Artificial Intelligent (40)
        • 제어 Control (45)
      • 프로그래밍 Programming (103)
        • 매트랩 MATLAB (25)
        • 파이썬 Python (33)
        • 줄리아 Julia (2)
        • C++ (3)
        • 리눅스 우분투 Ubuntu (6)
      • 항공우주 Aeronautical engineeri.. (21)
        • 항법 Navigation (0)
        • 유도 Guidance (0)
      • 기계공학 Mechanical engineering (13)
        • 열역학 Thermodynamics (0)
        • 고체역학 Statics & Solid mechan.. (10)
        • 동역학 Dynamics (1)
        • 유체역학 Fluid Dynamics (0)
      • 수학 Mathematics (34)
        • 선형대수학 Linear Algebra (18)
        • 미분방정식 Differential Equation (3)
        • 확률및통계 Probability & Sta.. (2)
        • 미적분학 Calculus (1)
        • 복소해석학 Complex Analysis (5)
        • 실해석학 Real Analysis (0)
      • 수치해석 Numerical Analysis (21)
      • 확률 및 랜덤프로세스 Random process (2)
      • 추론 & 추정 이론 Estimation (3)
      • 기타 (26)
        • 설계 프로젝트 System Design (8)
        • 논문작성 Writing (55)
        • 세미나 Seminar (2)
        • 생산성 Productivity (3)
      • 유학 생활 Daily (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Statics
    딥러닝
    수식삽입
    Numerical Analysis
    IEEE
    인공지능
    ChatGPT
    Julia
    텝스공부
    우분투
    Zotero
    에러기록
    LaTeX
    논문작성법
    옵시디언
    수치해석
    생산성
    고체역학
    pytorch
    텝스
    논문작성
    Dear abby
    matplotlib
    WOX
    obsidian
    JAX
    MATLAB
    Python
    Linear algebra
    teps
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
보통의공대생
[MATLAB] 사용자 정의 함수 (로컬 함수, 중첩 함수, 익명 함수, 프라이빗 함수)
상단으로

티스토리툴바