Извлечение полей из массива структуры для помещения в другой массив структуры - PullRequest
1 голос
/ 13 апреля 2019

У меня есть структурный массив с большим количеством полей, которые меня не интересуют, поэтому я хочу извлечь ограниченное количество полей, которые меня интересуют, и поместить его в отдельный структурный массив.

Для структурного массива размером один я сделал это, создав новый массив с нуля, например:

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 Ответ

2 голосов
/ 13 апреля 2019

Вы можете создать новый массив структуры, используя существующие данные, следующим образом:

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