Структуры хранят свои поля отдельно, поэтому вам нужно пойти и применить свой фильтр к каждому из них.
Например, рассмотрим следующую структуру
%# 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]