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