只是一个说明,交易是不必要的:
[arr.val] = newVals{:}; % achieves the same as deal(newVals{:})
唯一的其他方式我知道如何做(没有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)
最后一个命令循环遍历arr中的每个结构,并返回一个新的,其中s.val已经设置为s.val = 3。
我认为这实际上比你以前的双线程和for循环的效率更低,因为它返回一个arr的副本,而不是就地运行。
(可惜Matlab不支持像[arr.val] = num2cell([arr.val] 3){:})这样的分层索引。