如何向量化这个算法,八度与matlab速度问题

时间:2012-12-25 00:01:12

标签: matlab octave vectorization

背景故事:

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

问题:

  1. 如何对此算法进行矢量化?
  2. matlab(经文八度)是否有办法自动向量化此代码以快1000倍运行 - 对于彩色图像420X420像素大小,0.1s对100s?
  3. 脚本:

    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
    

3 个答案:

答案 0 :(得分:3)

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快几倍的原因是Matlab使用JIT编译器从6.5版本开始大大加速了简单的for循环等。如果您不熟悉JIT是什么,请查看here。最后我查了一下,Octave仍然在研究他们自己的JIT,但我认为它还会有一段时间: - )。

您的Octave版本是否会受益于上述代码取决于他们如何在Octave中编写它。我期待一个很大的好处。

答案 1 :(得分:1)

如果我正确理解你的代码,它的作用是建立两个帧的联合颜色分布的二维直方图。

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

答案 2 :(得分:1)

感谢您的快速回复。

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

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

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