matlab - 如何向量化该算法,倍频程与 matlab 速度问题

标签 matlab octave vectorization

背景故事:

这是一个旧脚本,我需要比较同一对象的两个略有不同的图像以获取相机本身的数据。我用octave编写了这个脚本并尝试了它,后来我发现matlab用它运行得更快,所以从那以后我使用matlab而不是octave。 我最近决定再次检查 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

最佳答案

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 中编写它。我希望能得到很大的好处。

关于matlab - 如何向量化该算法,倍频程与 matlab 速度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14026607/

相关文章:

c++ - 类型向量化的适当通用习惯用法?

MATLAB 连接维度不等的矩阵

image - 在MATLAB中匹配具有不同方向和比例的图像

python - 使用 octave 和 python 生成的图像的不同文件大小

function - 无法使用 Octave 解决简单的 ODE

matlab - 鸡尾酒会算法 SVD 实现......在一行代码中?

machine-learning - 如何根据另一个向量将一个矩阵拆分为多个矩阵

matlab - 在 MATLAB 中向量化线性方程组的解

matlab - MATLAB 中的矢量化简介 - 有什么好的教程吗?

matlab - 使用 GUIDE 脚本打印频谱图