在Matlab中从结构的单元格数组中提取字段

时间:2018-08-06 14:58:55

标签: matlab struct extraction

我有一个单元格数组(假设大小为10),其中每个单元格都是具有相同字段的结构。假设它们都有一个字段名称x。

是否有一种方法可以将单元格数组中所有结构的向量x的值求得?我希望函数返回位置为1的大小为10的向量,单元格1中结构的字段x的值等等...

编辑1:

单元格阵列中的结构具有1个字段,除其他字段不同外,其他字段均相同。

3 个答案:

答案 0 :(得分:2)

首先将结构c的单元格数组(具有相同的字段名称,顺序相同)转换为结构数组:

c = cell2mat(c)

然后,根据字段的数据类型和大小,您也许可以使用

[c.x]

以“标准”方式提取字段x值的向量。

您也可以跳过转换步骤,并使用cellfun(@(e)e.x, c)一次提取。

答案 1 :(得分:1)

下面的代码创建一个结构的单元格数组,并将每个结构的字段“ x”提取到向量v。

%create a cell array of structures
s1.a = 'hello';
s1.x = 1;
s2.a = 'world';
s2.x = 2;
c{1} = s1;
c{2} = s2;
v = zeros(1,2);

%extract to vector
for idx=1:size(c,2)
    v(1,idx) = c{idx}.x;
end

答案 2 :(得分:0)

假设您有

c = {s1, s2, s3, ...., sn};

其中公共字段为“ field_1”,那么您有两个选择

使用cell2mat

cc = cell2mat(c); % which converts your cell array of structs into an array of structs

value = [cc.field_1]; % if values are number

value = {cc.field_1}; % if values are characters, for example

另一种选择是使用cellfun

如果字段值为字符,则应将“ UniformOutput”设置为“ false”

value = cellfun(@(x) x.field_1, c, 'UniformOutput', false)

第一种选择更好。另外,请尽量避免使用cell / cellfun / arrayfun,向量会更快,甚至普通的for循环都更有效