Zero out values in multiple fields of a struct

20 visualizzazioni (ultimi 30 giorni)
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 Commento
Stephen23
Stephen23 il 5 Mag 2023
"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:

Accedi per commentare.

Risposta accettata

Rich006
Rich006 il 8 Mag 2023
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 Commento
Matt J
Matt J il 8 Mag 2023
Modificato: Matt J il 8 Mag 2023
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.

Accedi per commentare.

Più risposte (1)

Matt J
Matt J il 5 Mag 2023
Modificato: Matt J il 5 Mag 2023
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 Commenti
Matt J
Matt J il 8 Mag 2023
You could do that, but it won't be efficient.
Rich006
Rich006 il 8 Mag 2023
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.

Accedi per commentare.

Categorie

Scopri di più su Data Type Identification in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by