【发布时间】:2013-05-25 08:46:16
【问题描述】:
我试图从一个大矩阵中获取 3 x 3 个掩码到向量中。目前,这是我的代码:
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); T(:,(i-1)*cols+j)=Ai(:);。这在我的机器上大约快 50%。 -
试试
im2col... -
@natan 当然......这是Matlab,其中有一个用于everything的frickin函数!谢谢!
-
@natan 大约需要一秒钟,而我更快的代码需要 140 秒。不错。
-
+1 表示
im2col。顺便说一句,我相信你的for循环中有一个错误,它会稍微减慢它们的速度。你正在重新分配内存。T的输出尺寸与您通过zeros指定的尺寸不同。T需要以不同方式分配,或者您需要T(:,(i-1)*(cols-2)+j)=...。不断增长数组是减慢速度的可靠方法。
标签: matlab vectorization nested-loops