Zero out values in multiple fields of a struct

20 visualizaciones (últimos 30 días)
Rich006
Rich006 el 5 de Mayo de 2023
Editada: Matt J el 8 de Mayo de 2023
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 comentario
Stephen23
Stephen23 el 5 de Mayo de 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:

Iniciar sesión para comentar.

Respuesta aceptada

Rich006
Rich006 el 8 de Mayo de 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 comentario
Matt J
Matt J el 8 de Mayo de 2023
Editada: Matt J el 8 de Mayo de 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.

Iniciar sesión para comentar.

Más respuestas (1)

Matt J
Matt J el 5 de Mayo de 2023
Editada: Matt J el 5 de Mayo de 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 comentarios
Matt J
Matt J el 8 de Mayo de 2023
You could do that, but it won't be efficient.
Rich006
Rich006 el 8 de Mayo de 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.

Iniciar sesión para comentar.

Categorías

Más información sobre Data Type Identification en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by