2015-07-10 128 views
2

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

我知道如何做到这一点:

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

结果变量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. 

,字段可以存储在结构的顶层或者一个子场下。 (注意,如果我从头开始做这件事,我会设计不同的事情来避免这个问题,但是我修改了一些代码,这是一个更大的工作流程中的中间步骤,所以我必须保留这些数据。结构一致)

目前,代码看起来是这样的:

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为空字段,并且我已经尝试使的形式为*.*,但是这两个选项都会引发错误,因为结果不是有效的变量名称。

有没有很好的方法来做到这一点?

+1

有趣的问题。我期待着答案。 – rayryeng

回答

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 
+0

这是一个很棒的诀窍!我现在可以在我的功能中删除大约四分之一的行,都是多余的。 – craigim

+0

我发布了一个[后续问题](http://stackoverflow.com/questions/31385908/dynamically-check-for-existence-of-structure-field-name-with-hierarchy)关于如何随后检查为领域的存在。有什么想法吗? – craigim