variable - struct with fields matlab
Iterando a través de nombres de campos struct en MATLAB (4)
Como los fields
o fns
son matrices de celdas, debe indexar con llaves {}
para acceder al contenido de la celda, es decir, la cadena.
Tenga en cuenta que en lugar de pasar por encima de un número, también puede recorrer los fields
directamente, haciendo uso de unas prácticas características de Matlab que le permiten recorrer cualquier matriz. La variable de iteración toma el valor de cada columna de la matriz.
teststruct = struct(''a'',3,''b'',5,''c'',9)
fields = fieldnames(teststruct)
for fn=fields''
fn
%# since fn is a 1-by-1 cell array, you still need to index into it, unfortunately
teststruct.(fn{1})
end
Mi pregunta se resume fácilmente como: "¿Por qué lo siguiente no funciona?"
teststruct = struct(''a'',3,''b'',5,''c'',9)
fields = fieldnames(teststruct)
for i=1:numel(fields)
fields(i)
teststruct.(fields(i))
end
salida:
ans = ''a''
??? Argument to dynamic structure reference must evaluate to a valid field name.
Especialmente desde teststruct.(''a'')
funciona. Y los fields(i)
imprimen ans = ''a''
.
No puedo entenderlo.
Debe usar llaves ( {}
) para acceder a los fields
, ya que la función de fieldnames
devuelve una matriz de celdas de cadenas:
for i = 1:numel(fields)
teststruct.(fields{i})
end
El uso de paréntesis para acceder a los datos en su matriz de células simplemente devolverá otra matriz de células, que se muestra de forma diferente a una matriz de caracteres:
>> fields(1) % Get the first cell of the cell array
ans =
''a'' % This is how the 1-element cell array is displayed
>> fields{1} % Get the contents of the first cell of the cell array
ans =
a % This is how the single character is displayed
Puede usar el para cada caja de herramientas en http://www.mathworks.com/matlabcentral/fileexchange/48729-for-each .
>> signal
signal =
sin: {{1x1x25 cell} {1x1x25 cell}}
cos: {{1x1x25 cell} {1x1x25 cell}}
>> each(fieldnames(signal))
ans =
CellIterator with properties:
NumberOfIterations: 2.0000e+000
Uso:
for bridge = each(fieldnames(signal))
signal.(bridge) = rand(10);
end
Me gusta mucho. Crédito, por supuesto, ir a Jeremy Hughes que desarrolló la caja de herramientas.
Su fns es una matriz de celdas. Necesitas indexarlo con {} en lugar de () para obtener la única cadena como char.
fns{i}
teststruct.(fns{i})
Al indexarlo con (), se devuelve una matriz cell de 1-largo, que no tiene el mismo formato que la matriz char que quiere la referencia de campo dinámico ". (Name)". El formateo, especialmente en la salida de la pantalla, puede ser confuso. Para ver la diferencia, intente esto.
name_as_char = ''a''
name_as_cellstr = {''a''}