matlab - 矢量化代码比 Matlab 中的 for 循环慢

标签 matlab for-loop matrix vectorization

我有一个名为 gimg 的 8x8 矩阵。我已经使用这段代码对 5 个不同的 gimg 矩阵执行了这段代码,一个向量化,另一个在 for 循环中。

tic
dm = zeros(size(gimg));

for x = 1:size(gimg, 1)
    for y = 1:size(gimg, 2)
        dm(x, y) = (1/(1 + (x - y)^2))*gimg(x,y);
    end
end
toc

tic
[x,y] = ndgrid(1:size(gimg, 1),1:size(gimg, 2));  

dm = (ones(size(gimg))./(1 + (x - y).^2)).*gimg;
toc

这是结果,

Elapsed time is 0.000057 seconds.
Elapsed time is 0.000247 seconds.

Elapsed time is 0.000062 seconds.
Elapsed time is 0.000199 seconds.

Elapsed time is 0.000056 seconds.
Elapsed time is 0.000195 seconds.

Elapsed time is 0.000055 seconds.
Elapsed time is 0.000192 seconds.

Elapsed time is 0.000056 seconds.
Elapsed time is 0.000187 seconds.

是因为ones矩阵吗?

我发现 matlab 中的特征加速显着改变了 for 循环的时间。所以我的问题是,现在使用 JIT 编译器的这些功能对代码进行矢量化是否值得?

更新: 这是我的 gimg 矩阵的一个例子

gimg =

         259          42           0           0           0           0           0           0
          42        1064          41           0           0           0           0           0
           0          55        3444         196           0           0           0           0
           0           0         215        3581          47           0           0           0
           0           0           0         100         806           3           0           0
           0           0           0           0           3           2           0           0
           0           0           0           0           0           0           0           0
           0           0           0           0           0           0           0           0

更新 2:@Divakar 代码的结果

>> test_vct
------------------------ With Original Loopy Approach
Elapsed time is 5.269883 seconds.
------------------------ With Original Vectorized Approach
Elapsed time is 6.314792 seconds.
------------------------ With Proposed Vectorized Approach
Elapsed time is 3.146764 seconds.
>> 

因此,在我的计算机中,原始矢量化方法仍然较慢。

我的电脑规范和 Matlab 版本

  • Matlab 2015a
  • Windows 8.1 x64
  • 英特尔 i7 860 2.80 Ghz
  • 16 Gb 内存
  • 英伟达 Geforce GTS250

最佳答案

这似乎比这两个都快 -

dm = (1./(1+bsxfun(@minus,[1:size(gimg, 1)]',1:size(gimg, 2)).^2).*gimg);

基准代码-

%// Random input
gimg = rand(8,8);

%// Number of trials (keep this a big number, as so to get runtimes of 1sec+
num_iter = 100000;

disp('------------------------ With Original Loopy Approach')
tic
for iter = 1:num_iter
    dm = zeros(size(gimg));     
    for x = 1:size(gimg, 1)
        for y = 1:size(gimg, 2)
            dm(x, y) = (1/(1 + (x - y)^2))*gimg(x,y);
        end
    end
end
toc

disp('------------------------ With Original Vectorized Approach')
tic
for iter = 1:num_iter
    [x,y] = ndgrid(1:size(gimg, 1),1:size(gimg, 2));
    dm2 = (ones(size(gimg))./(1 + (x - y).^2)).*gimg;
end
toc

disp('------------------------ With Proposed Vectorized Approach')
tic
for iter = 1:num_iter
    dm3 = (1./(1+bsxfun(@minus,[1:size(gimg, 1)]',1:size(gimg, 2)).^2).*gimg);
end
toc

结果-

------------------------ With Original Loopy Approach
Elapsed time is 4.996531 seconds.
------------------------ With Original Vectorized Approach
Elapsed time is 2.684011 seconds.
------------------------ With Proposed Vectorized Approach
Elapsed time is 1.338118 seconds.

关于matlab - 矢量化代码比 Matlab 中的 for 循环慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29826342/

相关文章:

matlab:带有一个或多个文件的uigetfile

arrays - Matlab:提取(拆分)数组元素的优雅方式

c++ - 迭代引用?

c++ - 在 for(int i=0;...) { for(int j=0; ...){summation}} 嵌套 for 循环中求和势能不起作用

c - 如何创建一个循环来连续获取浮点输入?

c++ - 使用 Eigen 创建简单矩阵?

MATLAB - 周期函数(角度)的最大似然

c++ - 我的 For 循环出现段错误

opencv - OpenCV 中的图像旋转(90 度)

MATLAB - 具有高级设置的多个绘图