我有一个结构数组,其中包含许多我不在乎的字段,因此我想提取我关心的有限数量的字段,并将其放入一个单独的结构数组中。
对于大小为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
不好,因为无用字段的数量远远超过有用字段的数量。
答案 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{:});