Matlab在C ++中仍然比opencv慢

时间:2014-07-15 14:42:15

标签: c++ performance matlab opencv cross-correlation

根据这个linkone,据说opencv比matlab快得多。第一个链接写在2012年3月,第二个链接晚于此。

在第一个链接中,它表示,“用OpenCV编写的程序运行速度比用Matlab编写的类似程序快得多。”并评价Matlab: 2/10OpenCV: 9/10

考虑一下,我有两个浮动矩阵,其大小为 1024 * 1024 mat1 mat2 )。我想关联这个矩阵。

在matlab中,

corr2(mat1,mat2);     //70-75 ms

在opencv中,c ++

Mat result(1,1,CV_32F);
matchTemplate(mat1,mat2,result, CV_TM_CCOEFF_NORMED);      // 145-150 ms

据我所知,c和c ++的速度大致相同。

所以,我想知道,为什么matlab在执行互相关时比opencv / c ++更快。 是因为我在比较错误的东西(即使结果相同),还是matlab的互相关实现比opencv实现快两倍?

请注意,我正在使用Matlab 2013aVisual Studio 2010

谢谢,

5 个答案:

答案 0 :(得分:2)

Matlab并不像你在做矩阵计算时那么糟糕。对于许多基本线性代数运算,Matlab调用了用fortran和c ++编写的rutines。因此,只要你不使用循环并在矩阵运算中表达它,Matlab实际上非常快。

http://www.mathworks.se/company/newsletters/articles/matlab-incorporates-lapack.html

答案 1 :(得分:2)

Matlab内置的函数附带了mkl和opencv的不行。因此,如果两者中存在两个完全相同的函数,则matlab可能比opencv更快(更多)。我试图在一个大矩阵上进行伪逆,并且matlab击败了所有东西(openblas,Armadillo,自我集成的mkl等)至少2次。然后我就停止弄清楚为什么只是将数据加载到matlab中并让它做到这一点。 opencv是迄今为止最慢的。在opencv中的10000x10000矩阵上尝试矩阵乘法。我的笔记本电脑花了10分钟。 Matlab用了1分钟。

答案 2 :(得分:1)

在您的场景中,没有理由期望matlab更慢。您正在调用单个函数,由语言解释器引起的开销并将数据传递给本机函数(mex函数)只需支付一次。

如果你为一个小的32 * 32矩阵调用相同的函数1024次,你可能会注意到开销(除非JIT-Compiler找到一个巧妙的技巧来优化代码)。

答案 3 :(得分:0)

如果您对所有内容进行矢量化并使用本机函数,那么Matlab可以很快。 但是如果你要在一个循环中做一些操作,即

A = zeros(100,100);
for m = 1:100
    for n = 1:100
        A(m, n) = 1/(m + n - 1);
    end
end

VS

Mat A(100, 100, CV_64F);
for (int r = 0; r < A.rows; r++)
  for (int c = 0; c < A.cols; c++) 
    A.at<double>(r, c) = 1 / (r + c - 1);

你会发现差异。

答案 4 :(得分:0)

对于相关函数(以及更多),matlab使用一个使用高级指令集的高级库。

然而,Matlab比您想象的要聪明,Matlab检查运行时是否在空间域或频域上执行得更快,而不是执行最快的解决方案。

我找不到corr2的提及,但我找到了normxcorr2

  

根据图像的大小计算空间或频域的互相关。