Matlab:加速大for循环
我试着把一个大矩阵中的3乘3掩模转换成向量。目前,这是我的代码: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,但无法
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)=……
。不断增加阵列肯定会降低速度。