Zero out values in multiple fields of a struct

24 ビュー (過去 30 日間)
Rich006
Rich006 2023 年 5 月 5 日
編集済み: Matt J 2023 年 5 月 8 日
Suppose I have
S.ABC0500 = struct('Keys',[1:9],'Values',rand(1,9));
S.ABC0800 = struct('Keys',[1:9],'Values',rand(1,9));
S.ABC0900 = struct('Keys',[1:9],'Values',rand(1,9));
S.Title = 'MyData';
S.Date = datetime('today');
How can I efficiently set all the values to zero? That is, I want to do
S.ABC0500.Values = zeros(1,9);
S.ABC0800.Values = zeros(1,9);
S.ABC0900.Values = zeros(1,9);
The number of ABC variables is large.
  1 件のコメント
Stephen23
Stephen23 2023 年 5 月 5 日
"How can I efficiently set all the values to zero"
With more suitable data design: don't force meta-data into fieldnames. A non-scalar structure would likely be better:

サインインしてコメントする。

採用された回答

Rich006
Rich006 2023 年 5 月 8 日
I have found my own answer, but there's probably a more elegant way.
fn = fieldnames(S); % array of S field names including the ABC variables
idx = regexp(fn,'ABC*'); % cell array of 1 or [] depending on whether fn matches 'ABC*'
for k=1:length(fn)
if idx{k}
S.(fn{k}).Values = zeros(1,9);
end
end
  1 件のコメント
Matt J
Matt J 2023 年 5 月 8 日
編集済み: Matt J 2023 年 5 月 8 日
I would simplify this to,
fn = fieldnames(S);
fn=fn( startsWith( fn ,"ABC"));
for k=1:length(fn)
S.(fn{k}).Values(:) = 0;
end
In particular, avoiding repeated calls to zeros() should speed things up a bit.

サインインしてコメントする。

その他の回答 (1 件)

Matt J
Matt J 2023 年 5 月 5 日
編集済み: Matt J 2023 年 5 月 5 日
I would recommend a different data organization:
S.Title = 'MyData';
S.Date = datetime('today');
S.ID=["ABC0500", "ABC0500", "ABC0900"]';
S.Values=rand(3,9);
S.Keys=repmat(1:9,3,1);
and then you can simply do,
S.Values(:)=0;
  3 件のコメント
Matt J
Matt J 2023 年 5 月 8 日
You could do that, but it won't be efficient.
Rich006
Rich006 2023 年 5 月 8 日
I guess when I said "efficiently" I meant without having to write a separate command for each variable. I only need to do this one time, so speed of execution isn't that important.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeVariables についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by