遍历 Matlab 结构
Iterating over 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]
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
但是Matlabreturns出现如下错误:
Argument to dynamic structure reference must evaluate to a valid field name.
有人可以向我解释为什么这是一个无效的字段名称吗?
问题是 fieldnames
returns 是一个元胞数组,因此您必须使用大括号来访问元胞的内容。这应该有效:
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
——参见
这正是 structfun
的用途。它允许您遍历结构的所有字段。
a = struct('a', 1, 'b', 2, 'c', 3);
structfun(@(x)disp(x), a)
1
2
3
或者,您可以考虑存储一个 数组 结构,而不是像您那样存储字段中包含数字的结构。每当您依赖字段名来了解排序时,使用不同的数据结构可能会更好。
因为在您的数据中,您无需使用 RAR_no_compartments_2_0
的字段名,只需按索引
分配分配给该字段的结构
RAR_no_compartments(1) = results.RAR_no_compartments_2_0;
RAR_no_compartments(2) = results.RAR_no_compartments_2_1;
...
这样,您将拥有一个 1 x 15 结构数组,而不是具有 15 个字段的 1 x 1 结构,这在 MATLAB 中更容易本地处理。
只是一个想法。
我有一个包含 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
但是Matlabreturns出现如下错误:
Argument to dynamic structure reference must evaluate to a valid field name.
有人可以向我解释为什么这是一个无效的字段名称吗?
问题是 fieldnames
returns 是一个元胞数组,因此您必须使用大括号来访问元胞的内容。这应该有效:
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
——参见
这正是 structfun
的用途。它允许您遍历结构的所有字段。
a = struct('a', 1, 'b', 2, 'c', 3);
structfun(@(x)disp(x), a)
1
2
3
或者,您可以考虑存储一个 数组 结构,而不是像您那样存储字段中包含数字的结构。每当您依赖字段名来了解排序时,使用不同的数据结构可能会更好。
因为在您的数据中,您无需使用 RAR_no_compartments_2_0
的字段名,只需按索引
RAR_no_compartments(1) = results.RAR_no_compartments_2_0;
RAR_no_compartments(2) = results.RAR_no_compartments_2_1;
...
这样,您将拥有一个 1 x 15 结构数组,而不是具有 15 个字段的 1 x 1 结构,这在 MATLAB 中更容易本地处理。
只是一个想法。