6

私は構造を持っています

s.a = [1 2 3];
s.b = [2 3 4 5];
s.c = [9, 6 ,3];
s.d = ... % etc. - you got the gist of it

今、各フ​​ィールドに保存されているデータに関数/操作を適用し、フィールドの内容を変更したい、つまり適用したい

s.a = myFun( s.a );
s.b = myFun( s.b );
s.c = myFun( s.c ); % etc. ...

上記のようにすべてのフィールドを明示的に記述せずにどうすればよいですか? 私は考えてstructfunいました-しかし、この「その場での」変更を達成する方法がよくわかりません...

ありがとう!

4

1 に答える 1

7

せっかちな読者のために、structfun解決策は私の答えの一番下にあります:-)しかし、私は最初に自問します...

ループを使用することの何が問題になっていますか? 次の例は、その方法を示しています。

%# An example structure
S.a = 2;
S.b = 3;

%# An example function
MyFunc = @(x) (x^2);

%# Retrieve the structure field names
Names = fieldnames(S);

%# Loop over the field-names and apply the function to each field
for n = 1:length(Names)
    S.(Names{n}) = MyFunc(S.(Names{n}));
end

やなどの Matlab 関数はarrayfuncellfun通常、明示的な loop よりも低速ですstructfunおそらく同じ問題に苦しんでいると思いますが、なぜ気にするのですか?

ただし、使用することを主張する場合はstructfun、次のように実行できます (一般性を強調するために、例をもう少し複雑にしました)。

%# structfun solution
S.a = [2 4];
S.b = 3;
MyFunc = @(x) (x.^2);
S = structfun(MyFunc, S, 'UniformOutput', 0);
于 2012-12-05T08:48:04.430 に答える