이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

익명 함수

익명 함수란?

익명 함수는 프로그램 파일에 저장되지 않지만, 데이터형이 function_handle인 변수와 연결됩니다. 익명 함수는 표준 함수와 마찬가지로 입력값을 받고 출력값을 반환할 수 있습니다. 그러나, 하나의 실행 가능 명령문만 포함할 수 있습니다.

예를 들어, 숫자의 제곱을 구하는 익명 함수에 대한 핸들을 생성해 보겠습니다.

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(1)
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));

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

  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를 호출하는 이 익명 함수는 여러 출력값을 반환할 수도 있습니다.

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

관련 항목