Согласно этому ссылка на сайт и это один, Говорят, что opencv намного быстрее, чем matlab. Первая ссылка написана в марте 2012 года, вторая чуть позже.
В первой ссылке сказано: «Программы, написанные на 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 поставляются с MKL и OpenCV’s Dont. Таким образом, если в обоих случаях присутствуют две абсолютно эквивалентные функции, matlab, вероятно, будет быстрее (намного), чем opencv. Я пытался сделать псевдообращение на большой матрице и Matlab побил все (openblas, Armadillo, само интегрирующийся mkl и т. Д.) Как минимум в 2 раза. Тогда я просто перестал выяснять, почему, просто загрузил данные в matlab и позволил этому сделать свое дело. opencv, безусловно, самый медленный. Попробуйте умножение матрицы на матрицу 10000×10000 в opencv. это заняло 10 минут на моем ноутбуке. Матлаб занял 1 минуту.
Matlab не так плох, как вы думаете, при выполнении матричных вычислений. Для многих операций базовой линейной алгебры Matlab вызывает рутины, написанные на фортране и с ++. Так что, пока вы не используете циклы и не формулируете их в матричных операциях, Matlab на самом деле очень быстр.
http://www.mathworks.se/company/newsletters/articles/matlab-incorporates-lapack.html
В вашем сценарии нет причин ожидать, что Matlab будет медленнее. Вы вызываете одну функцию, накладные расходы, вызванные интерпретатором языка, и передача данных собственной функции (функция mex) должна быть оплачена только один раз.
Если вы вызовете одну и ту же функцию 1024 раза для небольших матриц размером 32 * 32, вы, вероятно, заметите издержки (если JIT-компилятор не найдет хитрый прием для оптимизации кода).
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
Рассчитать взаимную корреляцию в пространственной или частотной области, в зависимости от размера изображений.