Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.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
Arrays 在MATLAB中:如何将结构的嵌套字段转换为单元数组?_Arrays_Matlab_Struct - Fatal编程技术网

Arrays 在MATLAB中:如何将结构的嵌套字段转换为单元数组?

Arrays 在MATLAB中:如何将结构的嵌套字段转换为单元数组?,arrays,matlab,struct,Arrays,Matlab,Struct,在MATLAB中,我想为1 x n结构(非标度结构)的每个索引提取一个嵌套字段,并作为1 x n单元数组接收输出。作为一个简单的示例,假设我从以下结构开始: s(1).f1.fa = 'foo'; s(2).f1.fa = 'yedd'; s(1).f1.fb = 'raf'; s(2).f1.fb = 'da'; s(1).f2 = 'bok'; s(2).f2 = 'kemb'; 我可以使用for循环生成所需的1 x 2单元阵列c: n = length(s); c = cell(1,n)

在MATLAB中,我想为1 x n结构(非标度结构)的每个索引提取一个嵌套字段,并作为1 x n单元数组接收输出。作为一个简单的示例,假设我从以下结构开始:

s(1).f1.fa = 'foo';
s(2).f1.fa = 'yedd';
s(1).f1.fb = 'raf';
s(2).f1.fb = 'da';
s(1).f2 = 'bok';
s(2).f2 = 'kemb';
我可以使用for循环生成所需的1 x 2单元阵列c:

n = length(s);
c = cell(1,n);
for k = 1:n
    c{k} = s(k).f1.fa;
end
如果我想对非嵌套字段(例如f2)执行类似操作,那么我可以“矢量化”操作(请参阅),只需编写:

c = {s.f2};

但是,相同的方法似乎不适用于嵌套字段。那么,对上述for循环进行矢量化的可能方法是什么呢?

您无法真正对其进行矢量化。问题是Matlab不允许大多数形式的嵌套索引,包括
[]。

最简洁/可读的选项是使用
[…]
s.f1
结果连接到结构数组中,然后使用单独的调用索引到新的结构数组中:

x = [s.f1]; c = {x.fa};
如果您有映射工具箱,则可以使用在一个表达式中执行第二个索引:

c = extractfield([s.f1], 'fa');
或者,您可以使用
arrayfun
编写一个单行程序-这里有几个选项:

c = arrayfun(@(x) x.f1.fa, s, 'uni', false);
c = arrayfun(@(x) x.fa, [s.f1], 'uni', false);
请注意,对于循环,
arrayfun
和类似函数通常比显式
慢。因此,如果性能非常关键,那么在决定摆脱循环之前,先对代码进行时间/概要分析