Car*_*arl 19 arrays matlab struct field assign
假设我有一个struct数组arr,其中每个元素都有一堆字段,包括一个字段val.我想将每个元素的val字段增加一些常量,如下所示:
for i = 1:length(arr)
arr(i).val = arr(i).val + 3;
end
Run Code Online (Sandbox Code Playgroud)
这显然有效,但我觉得应该有一种方法可以在一行代码中执行此操作(并且没有for循环).我想出的最好的是两行,需要一个临时变量:
newVals = num2cell([arr.val] + 3);
[arr.val] = deal(newVals{:});
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?谢谢.
mat*_*fee 11
只是一个注释,deal那里没有必要:
[arr.val] = newVals{:}; % achieves the same as deal(newVals{:})
Run Code Online (Sandbox Code Playgroud)
我知道如何执行此操作的唯一其他方法(没有foor循环)arrayfun用于迭代数组中的每个结构:
% make a struct array
arr = [ struct('val',0,'id',1), struct('val',0,'id',2), struct('val',0,'id',3) ]
% some attempts
[arr.val]=arr.val; % fine
[arr.val]=arr.val+3; % NOT fine :(
% works !
arr2 = arrayfun(@(s) setfield(s,'val',s.val+3),arr)
Run Code Online (Sandbox Code Playgroud)
最后一个命令循环遍历每个结构arr并返回一个s.val已设置为的新结构s.val=3.
我认为这实际上比你之前的双线和for循环效率低,因为它返回副本而arr不是就地操作.
(遗憾的是Matlab不支持分层索引[arr.val]=num2cell([arr.val]+3){:}).