Main Content

arrayfun

配列の個々の要素に関数を適用

説明

B = arrayfun(func,A) は、A の要素ごとに関数 func を適用します。次に、arrayfunAi 番目の要素について B(i) = func(A(i)) となるように func の出力を出力配列 B に連結します。入力引数 func は関数ハンドルであり、この関数は 1 つの入力引数を取ってスカラーを返します。func からの出力には、その型のオブジェクトが連結できる限り、任意のデータ型を使用できます。(1 つの例外については、制限を参照してください。)配列 AB のサイズは同じです。

arrayfun での B の要素の計算順序を指定したり、特定の順序で計算される要素に依存することはできません。

B = arrayfun(func,A1,...,An) は、B(i) = func(A1(i),...,An(i)) となるように func を配列 A1,...,An の要素に適用します。関数 func は、n 個の入力引数を取ってスカラーを返さなければなりません。配列 A1,...,An はすべて同じサイズでなければなりません。

B = arrayfun(___,Name,Value) は、1 つ以上の Name,Value のペアの引数で指定された追加オプションを使って func を適用します。たとえば、出力値を cell 配列で返すには、'UniformOutput',false を指定します。func の返した値を配列に連結できない場合に、cell 配列として B を返すことができます。前述の構文のいずれかの入力引数と Name,Value のペアの引数を使用することができます。

[B1,...,Bm] = arrayfun(___) は、funcm 個の出力値を返す場合に、複数の出力配列 B1,...,Bm を返します。func は異なるデータ型の出力引数を返すことができますが、func の呼び出しごとに各出力のデータ型は同じでなければなりません。この構文では、前述の構文の入力引数のいずれかを使用できます。

func の出力引数の数は、A1,...,An に指定された入力引数の数と一致する必要はありません。

すべて折りたたむ

非スカラー構造体配列を作成します。各構造体には、乱数のベクトルを含むフィールドが 1 つあります。ベクトルのサイズは異なります。

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

各構造体に数値配列を含む 2 つのフィールドがある構造体配列を作成します。

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 オブジェクトの配列を返し、これらを使用して各データ点セットに異なるマーカーを追加します。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.

非スカラー構造体配列を作成します。各構造体には、数値行列を含むフィールドが 1 つあります。

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 は各列の平均を含むベクトルを返すため、平均は配列として返されません。cell 配列に平均を返すには、名前と値のペア 'UniformOutput',false を指定します。

A = arrayfun(@(x) mean(x.f1),S,'UniformOutput',false)
A=1×3 cell array
    {[0.6158 0.5478 0.5943 0.6977 0.7476]}    {[0.6478 0.6664 0.3723 0.4882 0.4337 0.5536 0.5124 0.4436 0.5641 0.5566]}    {[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 の各要素の整数部を返します。

入力配列。A は、tabletimetable を除く任意の基本データ型または線形インデックスをサポートする任意のクラスに属する配列です。

関数を table または timetable の内容に適用するには、関数 varfunrowfunsplitapply、または groupsummary を使用します。

A の属するクラスを定義し、さらに Asubsref または size メソッドをオーバーロードした場合、arrayfun は以下の要件を A に課します。

  • Asize メソッドは double の配列を返さなければならない。

  • A は線形インデックス付けをサポートしなければならない。

  • size メソッドによって返されるサイズの積は、A の線形インデックス付けによって定義される A の範囲を超えてはならない。

名前と値の引数

引数のオプションのペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後になければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用してそれぞれの名前と値を区切り、Name を引用符で囲みます。

例: A = arrayfun(@(x) mean(x.f1),S,'UniformOutput',false) は平均を cell 配列で返します。S は構造体配列であり、その各構造体に f1 という名前のフィールドがあります。

true または false。'UniformOutput' と、true (1) または false (0) のいずれかで構成されるコンマ区切りのペアとして指定します。

'UniformOutput' の値

説明

true (1)

func は、arrayfun が配列に連結するスカラーを返さなければなりません。

false (0)

arrayfun は、func の出力を cell 配列で返します。func の出力は、任意のサイズと異なるデータ型をもつことができます。

エラーをキャッチする関数。'ErrorHandler' と関数ハンドルで構成されるコンマ区切りのペアとして指定します。func がエラーをスローした場合、'ErrorHandler' で指定されたエラー ハンドラーがエラーをキャッチし、その関数に指定されたアクションを実行します。エラー ハンドラーはエラーをスローするか、または func と同じ出力数を返さなければなりません。'UniformOutput' の値が true の場合、エラー ハンドラーの出力引数は func の出力と同じデータ型のスカラーでなければなりません。

エラー ハンドラーの最初の入力引数は、次のフィールドをもつ構造体です。

  • identifier — エラー識別子

  • message — エラー メッセージ テキスト

  • indexfunc がエラーをスローした入力配列の線形インデックス

エラー ハンドラーの残りの入力引数は、func がエラーをスローした原因である func の呼び出しの入力引数です。

func が出力引数として 2 つの double 型を返すと仮定します。エラー ハンドラーを 'ErrorHandler',@errorFunc として指定できます。ここで、errorFunc は警告を発行して 2 つの出力引数を返す関数です。

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

'ErrorHandler' を指定しない場合、arrayfunfunc がスローしたエラーを再スローします。

出力引数

すべて折りたたむ

出力配列。任意のデータ型の配列または cell 配列として返されます。

既定では、arrayfunfunc からの出力を配列に連結します。func はスカラーを返さなければなりません。func がオブジェクトを返す場合、そのオブジェクトが属するクラスは次の要件を満たさなければなりません。

  • オブジェクト配列の線形インデックス付けによる代入をサポートする

  • 入力と同じサイズをもつ配列を返す reshape メソッドをもつ

名前と値のペアの引数 'UniformOutput' の値が false (0) である場合、arrayfun は出力を cell 配列で返します。その場合、func の出力は任意のサイズと異なるデータ型をもつことができます。

制限

  • 異種混合配列

    UniformOutputtrue に設定されている場合、arrayfun は異種混合配列をサポートしません。

  • 複素数からなる入力配列の動作の違い

    入力配列 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
    

    次に cell 配列を作成し、A の要素を割り当てます。A(1) にインデックスを付けると、虚数部が 0 に等しいため、その値は実数として返されます。cell 配列は異なる型をもつデータを保存できるため、実数値と複素数値を C1 の異なる cell に保存できます。

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

    arrayfun を呼び出して、A の要素にアクセスします。値を cell 配列に割り当てます。arrayfun は、A(1) にアクセスするとき、この値を複素数として扱い、C2{1} に割り当てます。

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

拡張機能

バージョン履歴

R2006a より前に導入