Matlab: эффективное создание подмассивов из массива

У меня есть матрица m x m M, из которой я выбираю разные части для создания подмассивов k в матрицу n x n x k N. Мне интересно: можно ли это сделать эффективно без цикла for?

Вот простой пример:

M = [1:10]'*[1:10];                 %//' Large Matrix
indxs = [1 2;2 1;2 2];
N = zeros(4,4,3);                   %// Matrix to contain subarrays

for i=1:3,
   N(:,:,i) = M(3-indxs(i,1):6-indxs(i,1),3-indxs(i,2):6-indxs(i,2));
end

В моем реальном коде матрицы M и N довольно велики, и эта операция повторяется тысячи раз, так что эта неэффективность существенно сказывается на времени выполнения.


person Trock    schedule 03.06.2015    source источник
comment
вы можете использовать parfor (который работает параллельно на GPU), чтобы максимизировать скорость, но я думаю, что нет способа не использовать цикл for.   -  person Hadi    schedule 04.06.2015


Ответы (1)


Его можно векторизовать, дважды используя bsxfun. Однако это не означает, что он обязательно более эффективен:

M = [1:10].'*[1:10]; %'// Large Matrix
indxs = [1 2;2 1;2 2];

r = size(M,1);
ind = bsxfun(@plus, (3:6).', ((3:6)-1)*r); %'// "3" and "6" as per your example
N = M(bsxfun(@minus, ind, reshape(indxs(:,1)+indxs(:,2)*r, 1,1,[])));
person Luis Mendo    schedule 04.06.2015
comment
То же самое было сделано на моем конце, но с двумя bsxfun(@plus..) вместо этого для почти такой же производительности. - person Divakar; 04.06.2015