2

I have a matrix of structs:

s(1:2,1:3) = struct('a',1,'b',2);

I have a function that has 2 int inputs, and calculates an int values according to some logic. How can I Apply the function on all the matrix s using the fields of each struct ('a' and 'b') as input for the function. The result matrix should be the same size as s just with the result of the function as data.

function f = SomeFunctionIWrote(a,b)
    %...Some calculations...
    f = result;
 end

Thanks, Guy.

4

1 に答える 1

4

配列の各要素に同じ関数を適用するために、arrayfunが構築されています (役立つ議論/例については、Loren Shure によるこのブログ投稿を参照してください)。

fが関数で、がフィールドおよびsを持つ構造体の配列である場合、ab

result = arrayfun(@(x)f(x.a,x.b), s);

トリックを行います。以前にそれらに出くわしたことがない場合@(x)は、無名関数です。

関数がスカラーを返さない場合は、'uniformoutput'オプション ( に設定false) を使用しresultてセル配列にします。

result = arrayfun(@(x)f(x.a,x.b), s, 'uniformoutput', false); 

注1:arrayfun遅い!多くの場合 (常に?) ループよりも遅くなります。(私の経験/意見では)それの利点は、コードが変更された場合に行列の次元のサイズ/形状を処理する必要がなく、読みやすい短いコードに由来します。

注 2:入力/行スペースを節約するために and の代わりに and を使用できますが、明確さは犠牲'uni'0なり'uniformoutput'ますfalse

于 2013-01-19T23:09:58.120 に答える