Допустит, у меня есть структура вроде этого:логический индекс структуры с различными Размерными полями
S.index = 1:10;
S.testMatrix = zeros(3,3,10);
for x = 1:10
S.testMatrix(:,:,x) = magic(3) + x;
end
S.other = reshape(0:39, 4, 10);
Он содержит вектор 1x10, а 3x3x10 многослойной массивы и матрицы 4x10. Теперь скажите, что я хочу выбрать только записи, соответствующие индексам между 2 и 8. mask = S.index > 2 & S.index < 8;
Я пробовал structfun(@(x) x(mask), S, 'UniformOutput', 0);
, который правильно работал только для вектора, что имеет смысл. Итак, я решил, что все, что мне нужно, это расширить мою маску. Поэтому я сделал это.
test = structfun(@(x) x(repmat(mask, size(x, ndims(x) - 1), 1)), S, 'UniformOutput',0);
Вспученного mask
был правильным для матрицы, но не многостраничный массив. И 2D-матрица была сплющена к вектору.
Если бы я собирался индексировать эти элементы по отдельности, я бы что-то вроде этого:
S2.index = S.index(mask);
S2.other = S.other(:,mask);
S2.testMatrix = S.testMatrix(:,:,mask);
Мой случай использования сотни структур каждый с 20+ полей. Как мне настроить индексацию? Точная проблема связана с структурой с 1xN векторами, матрицами 3xN и 4xN и 3x3xN массивами. Маска построена на основе одного из векторов, представляющих время. Имена полей являются постоянными для каждой структуры, поэтому я могу переборщить ее и ввести в нее команды и запустить ее как функцию, но я ищу интеллектуальный способ ее индексирования.
Обновление: вот что выглядит многообещающим.
fn = fieldnames(S);
for x = 1:length(fn)
extraDim = repmat({':'}, 1, ndims(S.(fn{x})) - 1);
S2.(fn{x}) = S.(fn{x})(extraDim{:}, mask);
end
Это путает меня –
@AnderBiguri Позволяющего, что использование '': '' делает индексирование с символами [немного непоследовательным] (http://stackoverflow.com/q/36189651/2586922), да –