производительность — Matlab все еще медленнее, чем opencv в Stack Overflow

Согласно этому ссылка на сайт и это один, Говорят, что 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,

Спасибо,

4

Решение

Встроенные функции Matlab поставляются с MKL и OpenCV’s Dont. Таким образом, если в обоих случаях присутствуют две абсолютно эквивалентные функции, matlab, вероятно, будет быстрее (намного), чем opencv. Я пытался сделать псевдообращение на большой матрице и Matlab побил все (openblas, Armadillo, само интегрирующийся mkl и т. Д.) Как минимум в 2 раза. Тогда я просто перестал выяснять, почему, просто загрузил данные в matlab и позволил этому сделать свое дело. opencv, безусловно, самый медленный. Попробуйте умножение матрицы на матрицу 10000×10000 в opencv. это заняло 10 минут на моем ноутбуке. Матлаб занял 1 минуту.

2

Другие решения

Matlab не так плох, как вы думаете, при выполнении матричных вычислений. Для многих операций базовой линейной алгебры Matlab вызывает рутины, написанные на фортране и с ++. Так что, пока вы не используете циклы и не формулируете их в матричных операциях, Matlab на самом деле очень быстр.

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

2

В вашем сценарии нет причин ожидать, что Matlab будет медленнее. Вы вызываете одну функцию, накладные расходы, вызванные интерпретатором языка, и передача данных собственной функции (функция mex) должна быть оплачена только один раз.

Если вы вызовете одну и ту же функцию 1024 раза для небольших матриц размером 32 * 32, вы, вероятно, заметите издержки (если JIT-компилятор не найдет хитрый прием для оптимизации кода).

1

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);

Вы заметите разницу.

0

Для корреляционных функций (и многих других) Matlab использует расширенные библиотеки, которые используют расширенный набор команд.

Однако Matlab умнее, чем вы думаете, Matlab проверяет время выполнения, если операция будет выполняться быстрее в пространственной или частотной области, чем выполнение самого быстрого решения.

Я не могу найти упоминание для corr2, однако я нашел для normxcorr2

Рассчитать взаимную корреляцию в пространственной или частотной области, в зависимости от размера изображений.

0