Update multiple values in a struct array

1 ビュー (過去 30 日間)
Daniel Dickinson
Daniel Dickinson 2022 年 5 月 24 日
編集済み: Voss 2022 年 5 月 24 日
I have a struct array S with multiple fields. One of the fields contains numeric values. I want to add a scalar quantity to every entry in this field and overwrite the existing value. I can do this with a loop as follows:
for a = 1:length(S)
S(a).value = S(a).value + 5;
end
Is there a one-line function that does the equivalent?

採用された回答

Matt J
Matt J 2022 年 5 月 24 日
編集済み: Matt J 2022 年 5 月 24 日
No, but easy enough to make one:
[s(1:2).f]=deal(1,2);
s.f
ans = 1
ans = 2
s=incremStruct(s,'f',5);
s.f
ans = 6
ans = 7
function S=incremStruct(S,field,increm)
for i = 1:length(S)
S(i).(field) = S(i).(field) + increm;
end
end

その他の回答 (2 件)

Matt J
Matt J 2022 年 5 月 24 日
編集済み: Matt J 2022 年 5 月 24 日
You can do it in 2 lines,
C=num2cell([S.value]+5);
[S.value]=deal(C{:})

Voss
Voss 2022 年 5 月 24 日
編集済み: Voss 2022 年 5 月 24 日
This works whether the field is a scalar in each element of S or not:
S = struct('value',{[1 2 3] [2 3; 4 5] [] 6}); % initial struct array
celldisp({S.value});
ans{1} = 1 2 3 ans{2} = 2 3 4 5 ans{3} = [] ans{4} = 6
C = cellfun(@(x)x+5,{S.value},'UniformOutput',false); % perform the additions
[S.value] = C{:}; % assign the result back to the struct array
celldisp({S.value});
ans{1} = 6 7 8 ans{2} = 7 8 9 10 ans{3} = [] ans{4} = 11

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by