簡體   English   中英

Matlab在C ++中仍然比opencv慢

[英]Is Matlab still slower than opencv in C++

根據這個鏈接 ,這一個 ,據說OpenCV的比MATLAB更快。 第一個鏈接寫在2012年3月,第二個鏈接晚於此。

在第一個鏈接中,它說: “用OpenCV編寫的程序比用Matlab編寫的類似程序運行得快得多。” 並評價Matlab: 2/10OpenCV: 9/10

考慮一下,我有兩個浮點矩陣,其大小為1024 * 1024mat1mat2 )。 我想關聯這個矩陣。

在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

謝謝,

在進行矩陣計算時,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM