我希望能够在MATLAB(r2014a)中动态地将字段分配给结构数组,包括层次结构。除了通过以下示例之外,我不确定如何最好地描述问题。
我知道怎么做:
field_name1 = 'bar1';
field_name2 = 'bar2';
% ... etc.
foo.(field_name1) = pi;
foo.(field_name2) = exp(1);
% ... etc.
会生成包含字段foo
和bar1
的结构变量bar2
。
我希望能做到的是:
field_name1 = 'bar1';
field_name2 = 'bar2';
% ... etc.
if true_false_statement
extra_level = '';
else
extra_level = 'baz.';
end
foo.([extra_level field_name1]) = pi;
foo.([extra_level field_name2]) = exp(1);
% ... etc.
根据先前的条件,字段可以存储在结构的顶层,也可以存储在子字段下。
(请注意,如果我从头开始这样做,我会以不同的方式设计以避免此问题。但是,我正在修改一些代码,这是更大工作流程中的中间步骤,因此我必须保留数据结构相一致。)
目前,代码看起来像这样:
field_name1 = 'bar1';
field_name2 = 'bar2';
% ... etc.
if true_false_statement
foo.(field_name) = pi;
foo.(field_name) = exp(1);
% ... etc.
else
foo.baz.(field_name) = pi;
foo.baz.(field_name) = exp(1);
% ... etc.
end
对于一个或两个字段可能很好,但是有很多字段,这会产生大量的复制/粘贴代码。我已尝试将extra_level
设为空字段,并且我尝试按上述方式创建field_name
形式的*.*
,但这两个选项都会抛出错误,因为结果不是有效的变量名。
有没有好办法呢?
答案 0 :(得分:5)
我能想到的最简单的方法是实现你想要的使用(代码的中间块)是使用setfield
(这些日子主要是subsasgn
的包装器)以及空单元格数组扩展为空(我answered about in the past以及我想称之为特征的东西):
>> foo = struct();
>> extra_level = {};
>> foo = setfield(foo,extra_level{:},'bar1',1)
foo =
bar1: 1
>> extra_level = {'baz'};
>> foo = setfield(foo,extra_level{:},'bar2',2)
foo =
bar1: 1
baz: [1x1 struct]
>> foo.baz.bar2
ans =
2