일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Dear abby
- 수식삽입
- 우분투
- JAX
- 생산성
- Linear algebra
- 수치해석
- 옵시디언
- WOX
- LaTeX
- teps
- ChatGPT
- IEEE
- 논문작성법
- 인공지능
- 텝스
- 에러기록
- MATLAB
- 텝스공부
- Julia
- Numerical Analysis
- Python
- 논문작성
- Statics
- Zotero
- 고체역학
- 딥러닝
- matplotlib
- pytorch
- obsidian
- Today
- Total
뛰는 놈 위에 나는 공대생
[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'라는 글이 출력된다.
참고 자료
http://ssjarng.chosun.ac.kr/matlab/chapter06.pdf
'프로그래밍 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 |