Медленная инверсия матрицы в C++

В настоящее время я пытаюсь преобразовать код Matlab в C++ с помощью броненосца. Я преобразовал некоторый код Matlab, следуя документации aramdillo, на C++. Однако производительность разочаровывает по сравнению с Matlab.

В Matlab для обращения матрицы A размера (625x625) требуется около 0,1 секунды по сравнению с более чем 3 секундами в C++.

В С++ я пробовал оба

solve()

так же как

inv() 

Я знаю, что inv дает менее точные результаты, поэтому я не предпочитаю его использовать. Кроме того, мне действительно нужна обратная матрица A, так как я использую диагональные элементы позже в алгоритме.

Код, который дает эти результаты:

Матлаб

x=A\b
invA = A\eye(size(A))

C++

arma::mat x = solve(A,b)
arma::mat invA = solve(A,eye(625,625))

Версии, которые я использую:

C++:

  • Визуальная студия 2013

  • Броненосец 8.300.1

  • Интел МКЛ 2018.1.156

Матлаб:

  • матлаб 2016б

  • версия -blas

Intel(R) Math Kernel Library версии 11.3.1 Product Build 20151021 для приложений архитектуры Intel(R) 64, ветвь CNR AVX2

  • версия -лапак

Intel(R) Math Kernel Library версии 11.3.1 Product Build 20151021 для приложений архитектуры Intel(R) 64, филиал CNR AVX2 Linear Algebra PACKage Version 3.5.0

У кого-нибудь есть идея, как преодолеть эту нехватку скорости в С++ с помощью броненосца?


person M. Strijdveen    schedule 08.12.2017    source источник
comment
Вы включили оптимизацию? Вместо этого вы можете попробовать eigen. Если это не поможет, вам нужно будет углубиться в сгенерированный код и посмотреть, что он делает, чего не делает Matlab. Но вы можете ожидать, что такие операции, как обратная матрица, будут очень хорошо оптимизированы в Matlab, поэтому я не ожидаю больших улучшений производительности. Вы также можете попробовать лучший компилятор. VS2013 отсутствует по сегодняшним меркам. Вместо этого вы можете попробовать g++.   -  person nwp    schedule 08.12.2017
comment
Вам действительно требуется обратное? Если вы решаете Ax=y, то есть гораздо более быстрые способы, чем грубая инверсия, в зависимости от структуры вашей матрицы.   -  person virgesmith    schedule 08.12.2017
comment
В Visual Studio убедитесь, что вы выбрали вариант выпуска при сравнении тестов, а не вариант отладки.   -  person Mikhail Genkin    schedule 08.12.2017


Ответы (1)


Вы пробовали: добавить в свой код #ARMA_USE_LAPACK? Это позволяет вашему коду использовать более оптимизированную версию функции .inv(). Также проверьте документацию: http://arma.sourceforge.net/docs.html

person Buddy    schedule 08.12.2017