Main Content

익명 함수

익명 함수란?

익명 함수는 프로그램 파일에 저장되지 않지만, 데이터형이 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 등의 함수에서 발생합니다. 익명 함수의 본문에서 이러한 함수를 사용하지 않도록 하십시오.

여러 익명 함수

익명 함수 내 표현식은 다른 익명 함수를 포함할 수 있습니다. 이는 특정 범위의 값에 대해 실행하는 함수에 여러 파라미터를 전달하는 경우 유용합니다. 예를 들어, 다음 방정식에 대해

An equation for the function g of c which is equal to the integral from 0 to 1 of x squared plus c times x plus 1 times d x.

다음 두 개의 익명 함수를 결합하여 다양한 c 값에 대해 해를 구해 볼 수 있습니다.

g = @(c) (integral(@(x) (x.^2 + c*x + 1),0,1));

다음은 이 명령문을 도출하는 방법입니다.

  1. 피적분 함수를 익명 함수로 작성합니다.

    @(x) (x.^2 + c*x + 1)
  2. 함수 핸들을 integral로 전달하여 0에서 1까지 함수를 실행합니다.

    integral(@(x) (x.^2 + c*x + 1),0,1)
  3. 전체 방정식에 대한 익명 함수를 생성하여 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)

여러 입력값이나 출력값이 있는 함수

익명 함수에는 표준 함수와 마찬가지로 입력 인수를 명시적으로 지정해야 하며, 여러 입력값을 지정하는 경우 쉼표로 구분합니다. 예를 들어, 이 함수는 두 개의 입력값, 즉 xy를 받습니다.

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)

Figure contains an axes object. The axes object contains an object of type surface.

익명 함수의 배열

대부분의 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

관련 항목