【问题标题】:How to vectorize this algorithm, octave verses matlab speed issue如何向量化这个算法,octave vs matlab速度问题
【发布时间】:2012-12-25 00:01:12
【问题描述】:

背景故事:

这是一个旧脚本,我需要比较同一物体的两张略有不同的图像,以获取相机本身的数据。我用 octave 编写了这个脚本并尝试了它,后来我发现 matlab 用它运行得更快,所以因为我使用 matlab 而不是 octave。 我最近决定再次检查八度,我仍然得到 1:1000 的速比。

问题:

  1. 如何向量化这个算法?
  2. matlab (verses octave) 是否有办法自动矢量化此代码以将运行速度提高 1000 倍 - 对于 420X420 像素大小的彩色图像,0.1 秒与 100 秒相比?

脚本:

color_depth = 8;
number_of_colors = 3;
number_of_grey_levels = 2^color_depth;
Double_Distribution_0 =zeros(number_of_grey_levels,number_of_grey_levels,number_of_colors);
frame_A = 1+int16(imread('Path\image_A.tif'));
frame_1 = 1+int16(imread('Path\image_1.tif'));
[height,width]=size(frame_A(:,:,1));
number_of_pixels = width*height;

for k = 1:number_of_colors
    tic
    for i = 1:height
        for j = 1:width
                Double_Distribution_0(frame_1(i,j,k),frame_A(i,j,k),k) = 1 + Double_Distribution_0(frame_1(i,j,k),frame_A(i,j,k),k);
        end
    end
   toc
end

【问题讨论】:

  • 您尝试过任何建议的解决方案吗?如果您觉得您的问题已经解决,请随时接受答案。

标签: matlab octave vectorization


【解决方案1】:

1) 是的,您可以按照 Shai 的解释对代码进行矢量化。但是,请注意他的解决方案缺少 frame_1 和 frame_A 上的颜色索引。这应该可以解决问题:

for k=1:number_of_colors
    f_1 = frame_1(:,:,k);
    f_A = frame_A(:,:,k);
    Double_Distribution_0(:,:,k) = accumarray( {f_1(:), f_A(:)}, 1,...
                                   [number_of_grey_levels, number_of_grey_levels] );

end

2) Matlab 比 Octave 快很多倍的原因在于,自 6.5 版以来,Matlab 使用 JIT 编译器大大加快了简单的 for 循环等。如果您不熟悉 JIT 是什么,请查看 here。最后我检查了一下,Octave 仍在开发他们自己的 JIT,但我认为这还需要一段时间 :-)。

您的 Octave 版本是否会从上述代码中受益取决于他们在 Octave 中的编写方式。我希望有很大的好处。

【讨论】:

    【解决方案2】:

    如果我正确理解您的代码,它的作用是构建两个帧的联合颜色分布的 2D 直方图。

    for k=1:number_of_colors
         Double_Distribution_0(:,:,k) = accumarray( {frame_1(:), frame_A(:)}, 1,...
                                   [number_of_grey_levels, number_of_grey_levels] );
    end
    

    【讨论】:

      【解决方案3】:

      感谢你们两位的快速回复。

      不知何故,部分语法不起作用,但当我将其缩短为:

      Double_Distribution_0(:,:,k) = accumarray({frame_1(:,:,k),frame_A(:,:,k)},1);
      

      我得到了我想要的(将结果与旧代码进行比较),在这种情况下,八度音程的运行时间仅比 matlab 高约 2 倍。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-10
        • 2018-06-24
        • 1970-01-01
        • 1970-01-01
        • 2011-07-08
        • 2013-12-22
        • 1970-01-01
        • 2014-12-02
        相关资源
        最近更新 更多