with variable una que graficar fields examples estructura ejemplos crear como matlab matlab-struct

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''}