Matlab:如何使用struct fun更新“就地”结构字段?

时间:2012-12-05 08:39:28

标签: matlab

我有一个结构

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 - 但我不太确定如何完成这个“到位”修改......

谢谢!

1 个答案:

答案 0 :(得分: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,通常为are slower than an explicit loop。我猜structfun可能会遇到同样的问题,所以为什么要这么麻烦?

但是,如果你坚持使用structfun,可以按照以下方式完成(为了强调一般性,我的例子稍微复杂一点):

%# structfun solution
S.a = [2 4];
S.b = 3;
MyFunc = @(x) (x.^2);
S = structfun(MyFunc, S, 'UniformOutput', 0);