How to get an array of all field elements of a 1xN structure with many fields
    11 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    Leo Simon
      
 el 2 de Oct. de 2021
  
    
    
    
    
    Comentada: Leo Simon
      
 el 3 de Oct. de 2021
            In this thread. @Sebastian asked how to get an array of all field elements of a 1xN structure.      @AdamDanz answered, but his answer only applies to a single specified field of a struct.     I want be able to loop through all fields of a struct and exact all elements of each field.    
For example
S(1).a = 1; S(2).a = 2 ; S(1).b = 3 ; S(2).b = 4;  S(1).c = [ 1, 2]; S(2).c = [ 3, 4]
From @AdamDanz's answer, I can write
[S(:).a]
[S(:).b]
etc.,  but naturally one wants to be able to loop thru all fields of S, as in
Fields = fieldnames(S);
for ii= 1:numel(Fields);
    field = Fields{ii};
    eval(['[S(:).' field ']']);
end
There has to be a less kludgy way of doing this!!!    Thanks!
1 comentario
  Stephen23
      
      
 el 2 de Oct. de 2021
				
      Editada: Stephen23
      
      
 el 2 de Oct. de 2021
  
			"There has to be a less kludgy way of doing this!!! "
For a start, you can trivially remove that very ugly and inefficient EVAL by using dynamic fieldnames:
i.e. replace this slow, inefficient, complex, anti-pattern code:
eval(['[S(:).' field ']']) % ugh, do NOT do this!
with this neat, simple, and very efficient code:
[S(:).(field)]
or equivalently just this:
[S.(field)]
See also:
Using a FOR loop is probably the most efficient solution to your original question.
Respuesta aceptada
  Matt J
      
      
 el 2 de Oct. de 2021
        
      Editada: Matt J
      
      
 el 2 de Oct. de 2021
  
      I would recommend the attached file
S(1).a = 1; S(2).a = 2 ; S(1).b = 3 ; S(2).b = 4;
T=scalarize_struct(S)
3 comentarios
  Matt J
      
      
 el 2 de Oct. de 2021
				scalarize_struct works for your modified example, too
S(1).a = 1; S(2).a = 2 ; S(1).b = 3 ; S(2).b = 4;  S(1).c = [ 1, 2]; S(2).c = [ 3, 4];
T=scalarize_struct(S)
Más respuestas (1)
  Jan
      
      
 el 2 de Oct. de 2021
        Fields = fieldnames(S);
for ii= 1:numel(Fields);
    field = Fields{ii};
    [S(:).(field)]
end
[...] is the horizontal concatenation, so the line [S(:).(field)] is equivalent to:
cat(2, S(:).(field))
Maybe you want to join the vectors vertically, then use cat(1, ...). If the arrays have different sizes, you need a cell array:
{S(:).(field)}
Ver también
Categorías
				Más información sobre Structures en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



