使用层次结构动态分配结构字段名称

时间:2015-07-10 20:37:57

标签: matlab data-structures

我希望能够在MATLAB(r2014a)中动态地将字段分配给结构数组,包括层次结构。除了通过以下示例之外,我不确定如何最好地描述问题。

我知道怎么做:

field_name1 = 'bar1';
field_name2 = 'bar2';
% ... etc.
foo.(field_name1) = pi;
foo.(field_name2) = exp(1);
% ... etc.

会生成包含字段foobar1的结构变量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形式的*.*,但这两个选项都会抛出错误,因为结果不是有效的变量名。

有没有好办法呢?

1 个答案:

答案 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