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
与字段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.
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
的表单*.*
,但是这两个选项都会抛出错误,因为结果不是有效的变量名.
有没有办法做到这一点?
我能想到的最简单的方法是实现你想要的使用(代码的中间块)就是使用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)