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

Extract fields from Structure Array to put into another Structure Array

我有一个包含大量我不关心的字段的结构数组,所以我想提取我关心的有限数量的字段并将其放入一个单独的结构数组中。

对于大小为 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 不是很好,因为无用字段的数量远远超过有用字段的数量。

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

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{:});