Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 使用层次结构动态分配结构字段名_Matlab_Data Structures - Fatal编程技术网

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

Matlab 使用层次结构动态分配结构字段名,matlab,data-structures,Matlab,Data Structures,我希望能够在MATLAB(r2014a)中为结构数组(包括层次结构)动态分配字段。我不确定如何最好地描述这个问题,除非通过下面的例子 我知道怎么做: field_name1 = 'bar1'; field_name2 = 'bar2'; % ... etc. foo.(field_name1) = pi; foo.(field_name2) = exp(1); % ... etc. 结果生成一个结构变量foo,其中包含字段bar1和bar2 我希望能够做到的是: field_name1 = '

我希望能够在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
设置为上述格式
*.
,但这两个选项都会引发错误,因为结果不是有效的变量名


有什么好办法吗?

我能想到的实现您想要的用途(中间代码块)的最简单方式是使用(现在主要是一个包装器)和空单元格数组扩展为零的事实(这是我已经做过的,我喜欢称之为功能):


有趣的问题。我期待着答案。这是一个伟大的把戏!我现在可以在我的函数中删掉大约四分之一的行,所有的行都是多余的。我已经发布了一篇关于如何随后检查字段是否存在的文章。有什么想法吗?
>> 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