迭代Matlab结构

迭代Matlab结构,matlab,structure,matlab-struct,Matlab,Structure,Matlab Struct,我有一个包含15个字段的1x1 Matlab结构 results = RAR_no_compartments_2_0: [1x1 struct] RAR_no_compartments_2_1: [1x1 struct] RAR_no_compartments_2_10: [1x1 struct] RAR_no_compartments_2_11: [1x1 struct] RAR_no_compartments_2_12: [1x1 struct

我有一个包含15个字段的1x1 Matlab结构

results = 

     RAR_no_compartments_2_0: [1x1 struct]
     RAR_no_compartments_2_1: [1x1 struct]
    RAR_no_compartments_2_10: [1x1 struct]
    RAR_no_compartments_2_11: [1x1 struct]
    RAR_no_compartments_2_12: [1x1 struct]
    RAR_no_compartments_2_13: [1x1 struct]
    RAR_no_compartments_2_14: [1x1 struct]
     RAR_no_compartments_2_2: [1x1 struct]
     RAR_no_compartments_2_3: [1x1 struct]
     RAR_no_compartments_2_4: [1x1 struct]
     RAR_no_compartments_2_5: [1x1 struct]
     RAR_no_compartments_2_6: [1x1 struct]
     RAR_no_compartments_2_7: [1x1 struct]
     RAR_no_compartments_2_8: [1x1 struct]
     RAR_no_compartments_2_9: [1x1 struct]
我正试图在
for
循环中遍历其中的每一项:

model_names=fieldnames(results); %get the names of each sub-struct
fieldname_dims=size(fieldnames(results)); %get dimensions of each struct
for i=1:fieldname_dims(1), %iterate over number of substructs
    name=model_names(i) %get the model name
    results.(name) %access the substruct
end
但是,Matlab返回以下错误:

Argument to dynamic structure reference must evaluate to a valid field name.

有人能给我解释一下为什么这是一个无效的字段名吗

问题在于
fieldnames
返回一个单元格数组,因此必须使用大括号来访问单元格内容。这应该起作用:

model_names=fieldnames(results);
fieldname_dims=size(fieldnames(results),1);
for i=1:fieldname_dims
    name=model_names{i};
    results.(name)
end
通过实际迭代单元格数组而不是使用计数器和临时变量,可以简化整个过程:

for name = fieldnames(results).'
    results.(name{:})  % do whatever with your field
end

但是,访问结构的所有字段的正确方法是
structfun
-请参见问题是
fieldnames
返回单元格数组,因此必须使用花括号访问单元格内容。这应该起作用:

model_names=fieldnames(results);
fieldname_dims=size(fieldnames(results),1);
for i=1:fieldname_dims
    name=model_names{i};
    results.(name)
end
通过实际迭代单元格数组而不是使用计数器和临时变量,可以简化整个过程:

for name = fieldnames(results).'
    results.(name{:})  % do whatever with your field
end
但是,访问结构的所有字段的正确方法是
structfun
——请参见,这正是它的用途。它允许您在结构的所有字段中循环

a = struct('a', 1, 'b', 2, 'c', 3);
structfun(@(x)disp(x), a)

1
2
3

交替地,您可以考虑存储结构的<强>数组,而不是一个结构,其中字段与它们中的数字一样。任何时候,只要依赖字段名来了解顺序,最好使用不同的数据结构

a = struct('a', 1, 'b', 2, 'c', 3);
structfun(@(x)disp(x), a)

1
2
3
因为在您的数据中,您只需通过索引分配分配给该字段的结构,而不是字段名
RAR\u no\u 2\u 0

RAR_no_compartments(1) = results.RAR_no_compartments_2_0;
RAR_no_compartments(2) = results.RAR_no_compartments_2_1;
...
通过这种方式,与具有15个字段的1 x 1结构相比,您将拥有一个1 x 15结构数组,它更易于在MATLAB中本地处理

只是一个想法。

这正是它的用途。它允许您在结构的所有字段中循环

a = struct('a', 1, 'b', 2, 'c', 3);
structfun(@(x)disp(x), a)

1
2
3

交替地,您可以考虑存储结构的<强>数组,而不是一个结构,其中字段与它们中的数字一样。任何时候,只要依赖字段名来了解顺序,最好使用不同的数据结构

a = struct('a', 1, 'b', 2, 'c', 3);
structfun(@(x)disp(x), a)

1
2
3
因为在您的数据中,您只需通过索引分配分配给该字段的结构,而不是字段名
RAR\u no\u 2\u 0

RAR_no_compartments(1) = results.RAR_no_compartments_2_0;
RAR_no_compartments(2) = results.RAR_no_compartments_2_1;
...
通过这种方式,与具有15个字段的1 x 1结构相比,您将拥有一个1 x 15结构数组,它更易于在MATLAB中本地处理


只是想一想。

返回的
字段名是一个单元格数组。您需要用
{}
索引它,而不是
()
返回的
字段名是一个单元格数组。您需要使用
{}
索引它,而不是
()