익명 함수
익명 함수란?
익명 함수는 프로그램 파일에 저장되지 않지만, 데이터형이
인 변수와 연결됩니다. 익명 함수는 여러 개의 입력값을 받아 하나의 출력값을 반환할 수 있습니다. 익명 함수는 하나의 실행 가능 명령문만 포함할 수 있습니다.function_handle
참고
deal
함수를 사용하여 여러 출력값을 반환하는 익명 함수를 만들 수 있습니다. 예제는 익명 함수에서 여러 출력값 반환하기 항목을 참조하십시오.
예를 들어, 숫자의 제곱을 구하는 익명 함수에 대한 핸들을 생성해 보겠습니다.
sqr = @(x) x.^2;
변수 sqr
은 함수 핸들입니다. @
연산자는 핸들을 생성하고, @
연산자 바로 다음에 있는 괄호 ()
는 함수 입력 인수를 포함합니다. 이 익명 함수는 단일 입력값 x
를 받으며, x
와 크기가 동일하고 제곱 값을 포함하는 배열인 단일 출력값을 암묵적으로 반환합니다.
입력 인수를 표준 함수로 전달하는 것과 마찬가지로, 특정 값(5
)을 함수 핸들에 전달하여 이 값에 대한 제곱을 구합니다.
a = sqr(5)
a = 25
많은 MATLAB® 함수가 함수 핸들을 입력값으로 받으므로 특정 범위의 값에 대해 함수를 실행할 수 있습니다. 함수에 대한 핸들은 익명 함수뿐만 아니라 프로그램 파일 내 함수에 대해서도 생성할 수 있습니다. 익명 함수를 사용하여 얻을 수 있는 이점은 간단한 정의만 필요로 하는 함수에 대해 파일을 편집하고 유지할 필요가 없다는 것입니다.
예를 들어, 함수 핸들을 integral
함수에 전달하여 0
에서 1
까지 sqr
함수에 대한 적분을 구해 보겠습니다.
q = integral(sqr,0,1);
익명 함수를 저장하기 위해 작업 공간에 변수를 생성할 필요는 없습니다. 그 대신, integral
함수에 대한 호출과 같이 표현식 내에 임시 함수 핸들을 생성할 수 있습니다.
q = integral(@(x) x.^2,0,1);
표현식(Expression) 내 변수
함수 핸들은 표현식뿐만 아니라 표현식을 실행하는 데 필요한 변수도 저장할 수 있습니다.
예를 들어, 계수 a
, b
, c
를 필요로 하는 익명 함수에 대한 핸들을 생성해 보겠습니다.
a = 1.3; b = .2; c = 30; parabola = @(x) a*x.^2 + b*x + c;
parabola
를 생성할 때 a
, b
, c
를 사용할 수 있으므로 함수 핸들에는 이러한 값이 포함됩니다. 이러한 값은 변수를 지워도 함수 핸들 내에 유지됩니다.
clear a b c x = 1; y = parabola(x)
y = 31.5000
계수에 다른 값을 제공하려면 새 함수 핸들을 생성해야 합니다.
a = -3.9; b = 52; c = 0; parabola = @(x) a*x.^2 + b*x + c; x = 1; y = parabola(x)
y = 48.1000
다음과 같이 save
함수와 load
함수를 사용하여, 함수 핸들 및 관련 값을 MAT 파일에 저장한 후 후속 MATLAB 세션에서 불러올 수 있습니다.
save myfile.mat parabola
익명 함수를 생성할 때는 명시적 변수만 사용해야 합니다. 익명 함수가 액세스하는 중첩 함수나 변수가 인수 목록이나 본문에서 명시적으로 참조되지 않는다면, 이 익명 함수 호출 시 MATLAB에서 오류가 발생됩니다. 묵시적인 변수 및 묵시적인 함수 호출은 흔히 eval
, evalin
, assignin
, load
등의 함수에서 발생합니다. 익명 함수의 본문에서 이러한 함수를 사용하지 않도록 하십시오.
여러 익명 함수
익명 함수 내 표현식은 다른 익명 함수를 포함할 수 있습니다. 이는 특정 범위의 값에 대해 실행하는 함수에 여러 파라미터를 전달하는 경우 유용합니다. 예를 들어, 다음 방정식에 대해
다음 두 개의 익명 함수를 결합하여 다양한 c
값에 대해 해를 구해 볼 수 있습니다.
g = @(c) (integral(@(x) (x.^2 + c*x + 1),0,1));
다음은 이 명령문을 도출하는 방법입니다.
피적분 함수를 익명 함수로 작성합니다.
@(x) (x.^2 + c*x + 1)
함수 핸들을
integral
로 전달하여 0에서 1까지 함수를 실행합니다.integral(@(x) (x.^2 + c*x + 1),0,1)
전체 방정식에 대한 익명 함수를 생성하여
c
에 대한 값을 제공합니다.g = @(c) (integral(@(x) (x.^2 + c*x + 1),0,1));
최종 함수를 사용하여 c
에 대한 임의의 값에 대해 방정식의 해를 구할 수 있습니다. 예를 들면 다음과 같습니다.
g(2)
ans = 2.3333
입력값이 없는 함수
함수에 입력값이 필요하지 않을 경우 익명 함수를 정의하고 호출할 때 빈 괄호를 사용합니다. 예를 들면 다음과 같습니다.
t = @() datestr(now); d = t()
d = 26-Jan-2012 15:11:47
대입문에서 괄호를 생략하면 또 다른 함수 핸들이 생성되며, 함수가 실행되지는 않습니다.
d = t
d = @() datestr(now)
여러 입력값이나 출력값이 있는 함수
익명 함수에는 표준 함수와 마찬가지로 입력 인수를 명시적으로 지정해야 하며, 여러 입력값을 지정하는 경우 쉼표로 구분합니다. 예를 들어, 이 함수는 두 개의 입력값, 즉 x
와 y
를 받습니다.
myfunction = @(x,y) (x^2 + y^2 + x*y); x = 1; y = 10; z = myfunction(x,y)
z = 111
하지만 익명 함수는 출력값을 하나만 반환합니다. 함수 내 표현식이 여러 출력값을 반환하는 경우 함수 핸들을 호출할 때 이를 요청할 수 있습니다.
예를 들어, ndgrid
함수는 입력 벡터의 개수만큼 출력값을 반환할 수 있습니다. ndgrid
를 호출하는 이 익명 함수는 출력값(mygrid
)을 하나만 반환합니다. mygrid
를 호출하여 ndgrid
함수에서 반환되는 출력값에 액세스합니다.
c = 10; mygrid = @(x,y) ndgrid((-x:x/c:x),(-y:y/c:y)); [x,y] = mygrid(pi,2*pi);
mygrid
의 출력값을 사용하여 메시 또는 곡면 플롯을 생성할 수 있습니다.
z = sin(x) + cos(y); mesh(x,y,z)
익명 함수의 배열
대부분의 MATLAB 기본 데이터형이 다차원 배열을 지원하지만 함수 핸들은 스칼라(단일 요소)여야 합니다. 그러나, 셀형 배열 또는 구조체형 배열을 사용하여 여러 함수 핸들을 저장할 수 있습니다. 가장 일반적인 방법은 다음과 같이 셀형 배열을 사용하는 것입니다.
f = {@(x)x.^2; @(y)y+10; @(x,y)x.^2+y+10};
셀형 배열을 생성할 때 MATLAB이 공백을 열 구분 기호로 해석함을 유의해야 합니다. 위에 나와 있는 코드에 표시된 대로 표현식에서 공백을 생략하거나 아래와 같이 표현식을 괄호로 묶습니다.
f = {@(x) (x.^2); @(y) (y + 10); @(x,y) (x.^2 + y + 10)};
중괄호를 사용하여 셀의 내용에 액세스합니다. 예를 들어, f{1}
은 첫 번째 함수 핸들을 반환합니다. 이 함수를 실행하려면 중괄호 다음에 입력값을 괄호로 묶어 전달하십시오.
x = 1; y = 10; f{1}(x) f{2}(y) f{3}(x,y)
ans = 1 ans = 20 ans = 21