[MATLAB] 함수 파라미터 default 값 설정 (arguments)
Python의 경우 함수를 선언할 때 파라미터의 default 값을 설정할 수 있다.
def myFunc(a=1, b=2) |
이렇게 말이다.
MATLAB에서는 python과 같은 syntax를 지원하지 않지만 비슷한 기능이 있다.
arguments 키워드
위 그림은 Mathworks 에서 설명하는 arguments 키워드의 구조이다.
함수를 선언하고, 첫 부분에 arguments~end block을 만들어준다.
Size, class. functions 등 복잡해보이는데 관심 있는 default 값 설정 방법부터 보겠다.
Parameter default 값 설정
defaultValue 설정 방법이다.
function [sum] = myFunc(a,b)
arguments
a = 1;
b = 2;
end
sum = a+b;
end
|
위 구조와 같이 함수를 선언 첫 부분에 arguments~end block을 만들어준다.
block 안에서 파라미터의 default 값을 입력한다.
앞에 구조에서 본 size, class, functions 등은 입력하지 않아도 무방한 설정값인 것이다.
이렇게 설정해주면 함수를 호출할 때 argument 전달을 하지 않아도 default 값으로 계산되며, 다른 값을 전달시 paramter가 override 되며 계산된다.
>> myFunc() ans = 3 >> myFunc(3,4) ans = 7 |
함수 호출 시 변수 a,b 는 포함해도 안해도 그만인 'optional' 변수가 되는 것이다.
<참고>
paramter 수가 많아진다면 더 이상 순서로 구분하는 게 어려워질 수 있다.
이 때 parameter를 struct 형태로 선언하면 parameter 이름으로 직접 값을 지정함으로써(name-value) 가독성을 높일 수 있다.
function [sum] = myFunc(params)
arguments
params.a = 1
params.b = 2
end
sum = params.a + params.b;
end
|
params를 struct로 선언하고 struct안에 멤버 변수 a,b를 선언했다.
이렇게 되면 함수는 더 이상 순서로 arguement 값을 추론하지 못하고, 이름을 전달해줘야만한다.
>> myFunc(2) Error using myFunc (line 1) myFunc(2) ↑ Invalid argument at position 1. A name is expected. >> myFunc(a=2) ans = 4 |
사실 parameter 수가 많지 않아도 name-value 지정이 코딩할 때 편해서 나는 주로 이 방법을 이용한다.
Argument validation 기능
이제 또 다른 기능을 살펴보겠다.
arguments~end block 의 다른 기능은 전달된 argument가 이상한 값이 아닌지 validation 해주는 것이다.
함수 실행 전, argument가 올바른 자료형인지, 행렬이라면 어떤 크기인지 등 확인하고 맞지 않다면 에러를 돌려보낸다.
먼저 Size 와 Class 두 개를 설정해보겠다.
function [sum] = myFunc(a)
arguments
a (2,2) double % 2x2 행렬, class double
end
disp("Argument validated!")
end
|
설정해둔 크기와 맞지 않은 argument가 입력되면 에러가 뜨는 것을 확인할 수 있다.
>> myFunc([1,2]) Error using myFunc (line 3) myFunc([1,2]) ↑ Invalid argument at position 1. Value must be a matrix of size 2-by-2. >> myFunc([1,2;3,4]) Argument validated! |
마지막으로 Functions 설정법이다.
inputArgs 가 설정한 fuctions에 대해 error를 도출하지 않는지 확인하는 단계이다.
여기서 functions는 MATLAB 내부 함수 뿐만 아니라 사용자 정의 함수도 포함이다.
우선 MATLAB 내부 함수인 mustBePositive를 사용해보겠다.
function [sum] = myFunc(a)
arguments
a {mustBePositive}
end
disp("Argument validated!")
end
|
음수의 argument를 전달했더니 에러가 난다.
>> myFunc(-1) Error using myFunc (line 3) myFunc(-1) ↑ Invalid argument at position 1. Value must be positive. |
이번엔 mustBePositive과 똑같은 기능의 커스텀 함수를 만들어보겠다.
function myMustBePositive(x)
if ~isnumeric(x)
error("myMustBePositive:NotNumeric", ...
"Value must be numeric.");
end
if any(x <= 0, 'all')
error("myMustBePositive:NotPositive", ...
"Value must be positive.");
end
end
|
validation function도 내가 만든 함수로 바꿔주면
function [sum] = myFunc(a)
arguments
a {myMustBePostive} % custom function
end
disp("Argument validated!")
end
|
아까와 똑같은 결과가 나올 것이다.
스크립트 적다보면 자주 필요한 기능이라 자세하게 적어봤다.
쓰다보면 알게될 것이다 매우 유용한 기능임을 .. 허허..