根据这个link和one,据说opencv比matlab快得多。第一个链接写在2012年3月,第二个链接晚于此。
在第一个链接中,它表示,“用OpenCV编写的程序运行速度比用Matlab编写的类似程序快得多。”并评价Matlab: 2/10
和OpenCV: 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 2013a
和Visual Studio 2010
。
谢谢,
答案 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
根据图像的大小计算空间或频域的互相关。