2013-05-29 2 views
3

Я пытаюсь получить 3 на 3 маски из большой матрицы в векторы. В настоящее время это мой код:Matlab: speed up for for

A=rand(3264,2448) 

[rows cols]=size(A); 

T=zeros(9,prod(size(A)-2)); 

for i=1:rows-2 

    for j=1:cols-2 

    T(:,(i-1)*cols+j)=reshape(A(i:i+2,j:j+2),[9 1]); 

    end 

end 

В настоящее время это занимает довольно долгое время. Могу ли я ускорить его? Я думаю, что meshgrid и arrayfun, но я не могу окунуться в них.

Спасибо!

+0

Я предполагаю, что 'A' не случайные значения в конкретном случае? И имеет значение, в каком порядке вы извлекаете маски (ядра) из большой матрицы? В настоящее время кажется, что вы сначала пересекаете столбцы, а затем увеличиваете строки. Одно простое ускорение - не вызывать 'reshape' и вместо этого делать это:' Ai = A (i: i + 2, j: j + 2); Т (:, (I-1) * смещ_по_столбцам + J) = Ai (:); '. Это примерно на 50% быстрее на моей машине. – horchler

+0

A - это данные изображения в реальном случае. Порядок не имеет значения, так как мы увидим каждую из этих масок как точку в 9-D пространстве. – user2434350

+0

Ниже примерно на 30% быстрее: j = 1; для i = 1: prod (размер (A)) - 2 * rows-2 testrow = mod (i, rows); if (testrow ~ = rows-1 & testrow ~ = rows-2) T (:, j) = A ([i; i + 1; i + 2; i + rows; i + rows + 1; i + строки + 2; I + 2 * строка; I + 2 * строка + 1; I + 2 * строка +-]); конец конец – user2434350

ответ

3

Вы можете использовать im2col переставить блоки изображения в столбцы, например:

T = im2col(A,[3 3],'sliding');