更新Matlab结构数组的每个元素中的一个字段

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){:}).