[英]Is Matlab still slower than opencv in C++
根據這個鏈接 ,這一個 ,據說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
。
謝謝,
在進行矩陣計算時,Matlab並不像你想象的那么糟糕。 對於許多基本線性代數運算,Matlab調用了用fortran和c ++編寫的rutines。 所以只要你不使用循環並在矩陣運算中表達它,Matlab實際上非常快。
http://www.mathworks.se/company/newsletters/articles/matlab-incorporates-lapack.html
Matlab內置函數附帶mkl和opencv不。 因此,如果兩者中存在兩個完全相同的函數,則matlab可能比opencv更快(更多)。 我試圖在一個大矩陣上進行偽逆,並且matlab擊敗了所有東西(openblas,Armadillo,自我集成的mkl等)至少2次。 然后我就停止弄清楚為什么只是將數據加載到matlab中並讓它做到這一點。 opencv是迄今為止最慢的。 在opencv中的10000x10000矩陣上嘗試矩陣乘法。 我的筆記本電腦花了10分鍾。 Matlab用了1分鍾。
在您的場景中,沒有理由期望matlab更慢。 您正在調用單個函數,由語言解釋器引起的開銷以及將數據傳遞給本機函數(mex函數)只需支付一次。
如果你為一個小的32 * 32矩陣調用相同的函數1024次,你可能會注意到開銷(除非JIT-Compiler找到一個優化代碼的巧妙技巧)。
如果您對所有內容進行矢量化並使用本機函數,那么Matlab可以很快。 但是,如果你在循環中做一些操作,即
A = zeros(100,100);
for m = 1:100
for n = 1:100
A(m, n) = 1/(m + n - 1);
end
end
與
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);
你會注意到差異。
對於相關函數(以及更多),matlab使用使用高級指令集的高級庫。
然而,Matlab比您想象的要聰明,Matlab檢查運行時是否在空間域或頻域上執行得更快,而不是執行最快的解決方案。
我找不到corr2,但我發現normxcorr2
根據圖像的大小計算空間或頻域中的互相關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.