Matlab:加速大型For循环

3

我正在尝试从一个大矩阵中获取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,但还不能完全理解它们。

谢谢!


以下代码比原来快30%:j=1; for i=1:prod(size(A))-2rows-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+rows+2;i+2rows;i+2rows+1;i+2rows+2]); end end - user2434350
6
尝试使用 im2col... - bla
1
@natan 当然....这是Matlab,有一个该死的函数可以做任何事情!谢谢! - user2434350
1
@natan 需要大约一秒钟的时间,而我的更快的代码需要 140 秒。不错。 - user2434350
1
+1 for im2col。顺便说一下,我相信你的for循环中有一个错误,这会稍微减慢它们的速度。你正在重新分配内存。T的输出维度与你通过zeros指定的不同。要么就需要用不同的方法分配T,要么就需要使用T(:,(i-1)*(cols-2)+j)=...。不断扩展数组是拖慢速度的必然方式。 - horchler
显示剩余3条评论
1个回答

3

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接