Могу ли я сохранить ломтик MATLAB в переменной? - PullRequest
3 голосов
/ 25 июля 2011

У меня есть длинная последовательность срезов, которую нужно применить ко многим матрицам MATLAB. Как я могу это сделать?

т.е. можно упростить,

y(1:some_var*3,1:some_other_var*3,1:another_var*3) = x1(1:some_var*3,1:some_other_var*3,1:another_var*3) .* x2(1:some_var*3,1:some_other_var*3,1:another_var*3) ./ x3(1:some_var*3,1:some_other_var*3,1:another_var*3)

что-то вроде,

inds = slice(1:some_var*3,1:some_other_var*3,1:another_var*3)
y(inds) = x1(inds) .* x2(inds) ./ x3(inds)

как я могу сделать в Python?

Ответы [ 2 ]

3 голосов
/ 25 июля 2011

В вашем случае вы можете создать логическую маску:

%# assuming x1,x2,x3,y are all of the same size

mask = false(size(x1));
mask(1:some_var*3,1:some_other_var*3,1:another_var*3) = true;

y(mask) = x1(mask).*x2(mask)./x3(mask);

Другие функции, о которых вы можете прочитать: НАЙТИ , SUB2IND

2 голосов
/ 25 июля 2011

Один из вариантов - сохранить каждый вектор индексов в ячейке массива ячеек , а затем извлечь содержимое массива ячеек в виде списка, разделенного запятыми , например:

inds = {1:some_var*3, 1:some_other_var*3, 1:another_var*3};
y(inds{:}) = x1(inds{:}) .* x2(inds{:}) ./ x3(inds{:});

Если у вас большие матрицы с относительно небольшими / разреженными наборами индексов, это может быть более эффективным, чем с использованием логической маски, как предложил Амро .

...