Просто примечание, deal
там не обязательно:
[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){:}
).