Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

arrayfun

배열의 각 요소에 각각 함수 적용

설명

예제

B = arrayfun(func,A)는 한 번에 하나씩, A의 요소에 함수 func를 적용합니다. 그러면 arrayfun 함수가 func 함수의 출력값을 출력 배열 B로 결합하므로, Ai번째 요소의 경우 B(i) = func(A(i))가 됩니다. 입력 인수 func는 하나의 입력 인수를 받고 스칼라를 반환하는 함수에 대한 함수 핸들입니다. func의 출력값은 해당 데이터형의 객체를 결합할 수 있는 한, 어떤 데이터형이든 될 수 있습니다. 배열 AB의 크기는 같습니다.

사용자는 arrayfunB의 요소를 계산하는 순서를 지정할 수 없으며, 또한 특정 순서로 계산을 수행하기를 기대할 수도 없습니다.

B = arrayfun(func,A1,...,An)B(i) = func(A1(i),...,An(i))가 성립되도록 배열 A1,...,An의 요소에 func를 적용합니다. func 함수는 n개 입력 인수를 가져와서 스칼라를 반환해야 합니다. 배열 A1,...,An은 모두 크기가 같아야 합니다.

예제

B = arrayfun(___,Name,Value)는 하나 이상의 Name,Value 쌍 인수를 추가 옵션으로 지정하여 func를 적용할 때 사용합니다. 예를 들어, 출력값을 셀형 배열로 반환하려면 'UniformOutput',false를 지정하십시오. func가 배열로 결합할 수 없는 값을 반환할 때 B를 셀형 배열로 반환할 수 있습니다. 위에 열거된 구문 중 하나의 입력 인수와 함께 Name,Value 쌍 인수를 사용할 수 있습니다.

예제

[B1,...,Bm] = arrayfun(___)funcm개 출력값을 반환할 경우 여러 개의 출력 배열 B1,...,Bm을 반환합니다. func는 데이터형이 서로 다른 출력 인수를 반환할 수 있지만, func를 호출할 때마다 각 출력값의 데이터형은 매번 동일해야 합니다. 이 구문은 위에 열거된 구문 중 하나의 입력 인수에 사용할 수 있습니다.

func에서 생성된 출력 인수 개수가 A1,...,An으로 지정된 입력 인수 개수와 같을 필요는 없습니다.

예제

모두 축소

비 스칼라 구조체형 배열을 만듭니다. 각 구조체에는 난수의 벡터를 포함하는 필드가 있습니다. 벡터의 크기는 서로 다릅니다.

S(1).f1 = rand(1,5);
S(2).f1 = rand(1,10);
S(3).f1 = rand(1,15)
S=1×3 struct array with fields:
    f1

arrayfun 함수를 사용하여 S 내 각 필드의 평균을 계산합니다. structfun에 대한 입력 인수는 스칼라 구조체여야 하므로 이 계산에는 structfun 함수를 사용할 수 없습니다.

A = arrayfun(@(x) mean(x.f1),S)
A = 1×3

    0.6786    0.6216    0.6069

숫자형 배열을 포함하는 두 개의 필드가 각각의 구조체에 들어 있는 구조체형 배열을 만듭니다.

S(1).X = 5:5:100; S(1).Y = rand(1,20);
S(2).X = 10:10:100; S(2).Y = rand(1,10);
S(3).X = 20:20:100; S(3).Y = rand(1,5)
S=1×3 struct array with fields:
    X
    Y

숫자형 배열을 플로팅합니다. plot 함수에서 chart line 객체로 구성된 배열을 반환하고 chart line 객체를 사용하여 각 데이터 점 집합에 다른 마커를 추가합니다. arrayfun은 데이터형의 객체를 결합할 수 있다면 어떤 데이터형의 배열도 반환할 수 있습니다.

figure
hold on
p = arrayfun(@(a) plot(a.X,a.Y),S);
p(1).Marker = 'o';
p(2).Marker = '+';
p(3).Marker = 's';
hold off

Figure contains an axes object. The axes object contains 3 objects of type line.

비 스칼라 구조체형 배열을 만듭니다. 각 구조체에는 숫자형 행렬을 포함하는 필드가 있습니다.

S(1).f1 = rand(3,5);
S(2).f1 = rand(6,10);
S(3).f1 = rand(4,2)
S=1×3 struct array with fields:
    f1

arrayfun 함수를 사용하여 S 내 각 필드의 평균을 계산합니다. mean은 각 열의 평균을 포함하는 벡터를 반환하므로, 평균은 배열로 반환할 수 없습니다. 평균을 셀형 배열로 반환하려면 'UniformOutput',false 이름-값 쌍을 지정하십시오.

A = arrayfun(@(x) mean(x.f1),S,'UniformOutput',false)
A=1×3 cell array
    {[0.6158 0.5478 ... ]}    {[0.6478 0.6664 ... ]}    {[0.3534 0.5603]}

비 스칼라 구조체형 배열을 만듭니다.

S(1).f1 = 1:10;
S(2).f1 = [2; 4; 6];
S(3).f1 = []
S=1×3 struct array with fields:
    f1

arrayfun 함수를 사용하여 S 내 각 필드의 크기를 계산합니다. 행 개수와 열 개수가 각각 1×3 숫자형 배열로 표시됩니다.

[nrows,ncols] = arrayfun(@(x) size(x.f1),S)
nrows = 1×3

     1     3     0

ncols = 1×3

    10     1     0

입력 인수

모두 축소

입력 배열의 요소에 적용할 함수로, 함수 핸들로 지정됩니다.

func는 둘 이상의 함수 파일에 대응할 수 있으며, 따라서 일련의 오버로드된 함수를 나타낼 수 있습니다. 이러한 경우 MATLAB®은 입력 인수의 클래스에 따라 어떤 함수를 호출할지를 결정합니다.

예: B = arrayfun(@round,A)A 내 각 요소의 정수 부분을 반환합니다.

입력 배열입니다. Atabletimetable을 제외한 모든 기본 데이터형 또는 선형 인덱싱을 지원하는 모든 클래스에 속하는 배열일 수 있습니다.

테이블 또는 타임테이블의 내용에 함수를 적용하려면 varfun, rowfun, splitapply 또는 groupsummary 함수를 사용하십시오.

A가 속하는 클래스를 정의하고 Asubsref 또는 size 메서드도 오버로드한 경우, arrayfunA에 다음 요구 사항을 부과합니다.

  • Asize 메서드는 double형의 배열을 반환해야 합니다.

  • A는 선형 인덱싱을 지원해야 합니다.

  • size 메서드에서 반환되는 크기의 곱이, A에 대한 선형 인덱싱으로 정의되는 A의 한계를 초과하지 않아야 합니다.

이름-값 인수

예: A = arrayfun(@(x) mean(x.f1),S,'UniformOutput',false)는 평균을 셀형 배열로 반환합니다. S는 각 구조체에 f1이라는 필드가 있는 구조체형 배열입니다.

선택적으로 Name,Value 인수가 쉼표로 구분되어 지정됩니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. Name은 따옴표 안에 표시해야 합니다. Name1,Value1,...,NameN,ValueN과 같이 여러 개의 이름-값 쌍의 인수를 어떤 순서로든 지정할 수 있습니다.

true 또는 false로, 'UniformOutput'과 함께 true(1)나 false(0)가 쉼표로 구분되어 지정됩니다.

'UniformOutput'의 값

설명

true (1)

funcarrayfun 함수가 배열로 결합하는 스칼라를 반환해야 합니다.

false (0)

arrayfun 함수는 func의 출력값을 셀형 배열로 반환합니다. func의 출력값은 크기 제한이 없으며 다양한 데이터형을 포함할 수 있습니다.

오류를 포착하는 함수로, 'ErrorHandler'와 함께 함수 핸들이 쉼표로 구분되어 지정됩니다. func에서 오류가 발생하면 'ErrorHandler'로 지정된 오류 핸들러는 오류를 포착하고 함수에 지정된 동작을 수행합니다. 오류 핸들러는 오류를 발생시키거나 func와 동일한 개수의 출력값을 반환해야 합니다. 'UniformOutput'의 값이 true인 경우 오류 핸들러의 출력 인수는 스칼라여야 하며 func의 출력값과 데이터형이 같아야 합니다.

오류 핸들러의 첫 번째 입력 인수는 다음 필드를 포함하는 구조체입니다.

  • identifier — 오류 ID

  • message — 오류 메시지 텍스트

  • index — 입력 배열 중 func가 오류를 발생시킨 위치에 대한 선형 인덱스

오류 핸들러에 대한 나머지 입력 인수는 func에서의 오류 발생을 초래한, func 호출에 대한 입력 인수입니다.

func가 두 개의 double형을 출력 인수로 반환한다고 가정하겠습니다. 오류 핸들러를 'ErrorHandler',@errorFunc로 지정할 수 있습니다. 여기서 errorFunc는 경고를 발생시키고 두 개의 출력 인수를 반환하는 함수입니다.

function [A,B] = errorFunc(S,varargin)
    warning(S.identifier, S.message); 
    A = NaN; 
    B = NaN;
end

'ErrorHandler'를 지정하지 않을 경우 arrayfun 함수는 func에서 발생한 오류를 다시 발생시킵니다.

출력 인수

모두 축소

출력 배열로, 모든 데이터형의 배열 또는 셀형 배열로 반환됩니다.

기본적으로 arrayfunfunc의 출력값을 배열로 결합합니다. func는 스칼라를 반환해야 합니다. func가 객체를 반환할 경우 객체가 속한 클래스는 다음 요구 사항을 충족해야 합니다.

  • 객체 배열에 대한 선형 인덱싱에 따른 할당 지원

  • 입력값과 같은 크기의 배열을 반환하는 reshape 메서드 포함

'UniformOutput' 이름-값 쌍의 인수 값이 false(0)인 경우 arrayfun은 출력값을 셀형 배열로 반환합니다. 이 경우 func의 출력값은 크기 제한이 없으며 서로 다른 데이터형을 가질 수 있습니다.

제한 사항

  • 복소수로 구성된 입력 배열의 동작 차이

    입력 배열 A가 복소수로 구성된 배열이고 일부 요소의 허수부가 0과 같다면 arrayfun을 호출하여 배열의 요소를 참조할 경우 서로 다른 결과가 나올 수 있습니다. arrayfun 함수는 항상 이러한 수를 허수부가 0인 복소수로 취급합니다. 그러나 요소를 참조하면 이러한 값이 실수로 반환됩니다.

    이와 같은 동작 차이를 살펴보기 위해 먼저 복소수로 구성된 배열을 만듭니다.

    A = zeros(2,1); A(1) = 1; A(2) = 0 + 1i
    
    A =
    
       1.0000 + 0.0000i
       0.0000 + 1.0000i
    

    그런 다음 셀형 배열을 만들고 여기에 A의 요소를 할당합니다. A(1)의 요소를 참조하면 허수부가 0과 같기 때문에 값이 실수로 반환됩니다. 셀형 배열은 서로 다른 형식을 갖는 데이터를 저장할 수 있으므로 실수 값과 복소수 값을 C1의 서로 다른 셀에 저장할 수 있습니다.

    C1 = cell(2,1); C1{1} = A(1); C1{2} = A(2)
    
    C1 =
    
      2×1 cell array
    
        {[               1]}
        {[0.0000 + 1.0000i]}
    

    arrayfun을 호출하고 A의 요소에 액세스합니다. 값을 셀형 배열에 할당합니다. arrayfunA(1)에 액세스할 때 해당 값을 복소수로 취급하여 C2{1}에 할당합니다.

    C2 = arrayfun(@(x) x, A, 'UniformOutput', false)
    
    C2 =
    
      2×1 cell array
    
        {[1.0000 + 0.0000i]}
        {[0.0000 + 1.0000i]}
    

확장 기능

버전 내역

R2006a 이전에 개발됨