【问题标题】:Matlab: speed up large for loopMatlab:加快大型for循环
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    相关资源
    最近更新 更多