Фильтровать «строки» в структуре Matlab - PullRequest
5 голосов
/ 24 августа 2011

У меня есть структура с 10 полями одинакового размера. Структура была прочитана из файла данных.

dataFile = ezread('myFile','\t');

Я получаю определенное поле (double) и создаю индексный массив для всех строк, которые больше 2.

a_field = dataFile.a_field;
a = ismember(a_field,2:1000)

Я мог бы использовать «a», чтобы получить все строки из другого поля, где «a_field» больше 2. Но как я могу отфильтровать всю структуру? Я хотел бы иметь новую структуру, которая содержит все строки из всех полей, где 'a_field' больше, чем 2.

Это основной вопрос, но я не могу найти легкий путь.

1 Ответ

11 голосов
/ 24 августа 2011

Структуры хранят свои поля отдельно, поэтому вам нужно пойти и применить свой фильтр к каждому из них.

Например, рассмотрим следующую структуру

%# a sample structure
dataFile.a_field = randn(20,1) + 1;
dataFile.b_field = num2str((1:20)','string %d');  %'
dataFile.c_field = rand(20,1);

%# find rows where 'a_field' is bigger than 2
idx = dataFile.a_field > 2;

Теперь у вас есть две опции для фильтрации других полей:

1) structfun

use STRUCTFUN для применения вашей функции фильтрации к каждому полю:

data2 = structfun(@(x) x(idx), dataFile, 'UniformOutput',false);

2) FOR-loop + имена динамических полей

написать явный цикл for и использовать динамические имена полей для доступа к каждому:

fn = fieldnames(dataFile);
for i=1:numel(fn)
    data2.(fn{i}) = dataFile.(fn{i})(idx);
end

3) cellarrays

В качестве альтернативы, мы могли бы преобразовать структуру в cellarray , затем применить нарезкуна всю вещь:

%# cellarray
C = struct2cell(dataFile);
C = [num2cell(C{1}) cellstr(C{2}) num2cell(C{3})];

%# filter rows from all columns
idx = vertcat(C{:,1}) > 2;
C_filtered = C(idx,:)

Результат в этом случае:

>> C_filtered
C_filtered = 
    [3.0034]    ' string 5'    [ 0.53406]
    [2.4158]    'string 11'    [ 0.18971]
    [2.0289]    'string 13'    [ 0.14761]
    [ 2.458]    'string 14'    [0.054974]
    [2.7463]    'string 16'    [ 0.56056]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...