2016-11-10 2 views
3

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

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 

ответ

4

Вы можете использовать тот факт, что the string ':' can be used as an index вместо :, и построить comma-separated list этой строки повторяется необходимое количество раз для каждого поля:

s = {':',':'}; % auxilary cell array to generate the comma-separated list 
S2 = structfun(@(f) f(s{1:ndims(f)-1}, mask), S, 'UniformOutput', false); 
+0

Это путает меня –

+1

@AnderBiguri Позволяющего, что использование '': '' делает индексирование с символами [немного непоследовательным] (http://stackoverflow.com/q/36189651/2586922), да –

Смежные вопросы