Сравнение экспоненциальной матрицы в C++ Armadillo и Matlab
Я пытался сравнить скорости матрицы Matlab Exponential с Armadillo C++ Matrix Exponential. Мне всегда говорили, что если вы хотите самый быстрый код, используйте C++, но тесты, которые я выполнял, подразумевают, что экспоненциальная матрица Matlab работает намного быстрее. Может кто-нибудь сообщить мне, если это было проверено в другом месте, или я делаю что-то не так?
Вот как я это реализовал:
Матрицы, которые я тестировал, были редкими и немного странными, но не особенно особенными. Важным моментом является то, что они имеют размеры 2^N на 2^N. Пусть I = [1 0; 0 1] - единичная матрица, а X = [0 1; 1 0] будет матрица транспонирования. Затем для N = 1,2,3,..., я сгенерировал матрицы,
A_1 = X
A_2 = kron(X,I) + kron(I,X)
A_3 = kron(X,I,I) + kron(I,X,I) + kron(I,I,X)
A_4 = kron(X,I,I,I) + kron(I,X,I,I) + kron(I,I,X,I) + kron(I,I,I,X)
и так далее... размером 2^N на 2^N, где kron(A,B,C,...) - произведение Кронекера матриц A,B,C,..., которое можно назвать крон (A, крон (B, крон (C,...))) как в броненосце, так и в матлабе.
Я использовал функцию expmat в Armadillo v7.300.1 и clock() для записи времени и скомпилировал на Mac в командной строке
c++ exptest.cpp -o exptest -larmadillo -std=c++14
В MatlabR2015a я использовал функцию expm и использовал timeit для записи времени.
N Matlab expm(A) (secs) Armadillo expmat(A) (secs)
1 2.1654E-4 4.25E-4
2 1.3655E-4 1.09E-4
3 1.5788E-4 1.26E-4
4 1.4571E-4 4.17E-4
5 2.7004E-4 6.34E-4
6 4.4781E-4 0.003055
7 0.0012 0.018804
8 0.0096 0.191102
9 0.0598 2.11156
10 0.4210 18.5047
11 3.1949 150.917
Является ли матричная экспонента Матлаба просто намного быстрее экспоненциальной матрицы Армадилло, или я делаю что-то не так? Кроме того, что является самым быстрым вычислительным ресурсом для матричных экспонент?