从结构数组中提取字段以放入另一个结构数组

时间:2019-04-12 23:59:29

标签: matlab struct matlab-struct

我有一个结构数组,其中包含许多我不在乎的字段,因此我想提取我关心的有限数量的字段,并将其放入一个单独的结构数组中。

对于大小为1的结构数组,我是通过从头开始创建新数组来完成的,例如:

structOld.a = 1;
structOld.b = 2;
structOld.usefulA = 'useful information';
structOld.usefulB = 'more useful information';
structOld.c = 3;
structOld.d = 'words';

keepFields = {'usefulA','usefulB'};

structNew = struct;
for fn = keepFields
    structNew.(fn{:}) = structOld.(fn{:});
end

给出

structNew = 

    usefulA: 'useful information'
    usefulB: 'more useful information'

有没有更有效的方法?如何缩放到大小为N的结构数组(向量)?

N = 50;
structOld(1).a = 1;
structOld(1).b = 2;
structOld(1).usefulA = 500;
structOld(1).usefulB = 'us';
structOld(1).c = 3;
structOld(1).d = 'ef';
structOld(2).a = 4;
structOld(2).b = 5;
structOld(2).usefulA = 501;
structOld(2).usefulB = 'ul';
structOld(2).c = 6;
structOld(2).d = 'in';
structOld(3).a = 7;
structOld(3).b = '8';
structOld(3).usefulA = 504;
structOld(3).usefulB = 'fo';
structOld(3).c = 9;
structOld(3).d = 'rm';
structOld(N).a = 10;
structOld(N).b = 11;
structOld(N).usefulA = 506;
structOld(N).usefulB = 'at';
structOld(N).c = 12;
structOld(N).d = 'ion';

在这种情况下,我想结束:

structNew = 

1x50 struct array with fields:

    usefulA
    usefulB

保留具有空白usefulA / usefulB字段的元素就可以了;以后如有需要,我可以摆脱它们。

使用rmfield不好,因为无用字段的数量远远超过有用字段的数量。

1 个答案:

答案 0 :(得分:2)

您可以使用现有数据创建新的struct数组,如下所示:

structNew = struct('usefulA',{structOld.usefulA},'usefulB',{structOld.usefulB});

如果您要保留任意一组字段名,则可以使用如下循环。在这里,我首先将数据从strcutOld提取到单元格数组data中,该数组包含上一行代码中struct调用的每个参数。 data{:}现在是这些参数的逗号分隔列表,下面的最后一行代码与上面的代码相同。

keepFields = {'usefulA','usefulB'};
data = cell(2,numel(keepFields));
for ii=1:numel(keepFields)
   data{1,ii} = keepFields{ii};
   data{2,ii} = {structOld.(keepFields{ii})};
end
structNew = struct(data{:});