Matlab:加速大for循环

Matlab:加速大for循环,matlab,vectorization,nested-loops,Matlab,Vectorization,Nested Loops,我试着把一个大矩阵中的3乘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,但无法

我试着把一个大矩阵中的3乘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,但无法完全理解它们

谢谢

可以使用将图像块重新排列为列,例如:

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

我猜
A
在实际情况下不是随机值?从大矩阵中提取掩码(内核)的顺序是否重要?目前,您似乎正在首先遍历列,然后递增行。一个简单的加速方法是不调用
重塑
,而是这样做:
Ai=A(i:i+2,j:j+2);T(:,(i-1)*cols+j)=Ai(:)。这在我的机器上快了50%左右。试试
im2col
。@natan当然……这是Matlab,这里有一个frickin'函数,可以处理所有的事情!谢谢大家!@natan大约需要一秒钟,而我更快的代码需要140秒。不错。
im2col
为+1。顺便说一句,我相信您的
for
循环中有一个bug,它会稍微减慢它们的速度。你在重新分配内存。
T
的输出维度与通过
零指定的维度不同。
T
需要以不同的方式分配,或者您需要
T(:,(i-1)*(cols-2)+j)=……
。不断增加阵列肯定会降低速度。