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

cra*_*gim 2 matlab data-structures

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

我知道怎么做:

field_name1 = 'bar1';
field_name2 = 'bar2';
% ... etc.
foo.(field_name1) = pi;
foo.(field_name2) = exp(1);
% ... etc.
Run Code Online (Sandbox Code Playgroud)

导致结构变量foo与字段bar1bar2.

我希望能做的是:

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.
Run Code Online (Sandbox Code Playgroud)

根据先前的条件,字段可以存储在结构的顶层,也可以存储在子字段下.

(请注意,如果我从头开始这样做,我会以不同的方式设计以避免此问题.但是,我正在修改一些代码,这是更大工作流程中的中间步骤,因此我必须保持数据结构的一致性.)

目前,代码看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

对于一个或两个字段可能很好,但是有很多字段,这导致了大量的复制/粘贴代码.我已经尝试创建extra_level一个空字段,并且我已经尝试制作上面field_name的表单*.*,但是这两个选项都会抛出错误,因为结果不是有效的变量名.

有没有办法做到这一点?

Tro*_*kin 5

我能想到的最简单的方法是实现你想要的使用(代码的中间块)就是使用setfield(subsasgn这些日子里主要是包装器)以及空单元阵列扩展为空的事实(我已经回答了一些问题)在过去和我喜欢称之为功能):

>> 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
Run Code Online (Sandbox Code Playgroud)