Armadillo C ++ не находит обратной матрицы

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

Мне кажется, что нет никаких вычислений. Также нет никаких ошибок.

Я использую следующий заголовок:

#include <armadillo>
using namespace std;
using namespace arma;

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

Входные данные:

mat A = randu<mat>(5,5);
A.print("A: ");
mat B = inv(A);
B.print("inv(A): ");

Выход:

A:
0.0013   0.1741   0.9885   0.1662   0.8760
0.1933   0.7105   0.1191   0.4508   0.9559
0.5850   0.3040   0.0089   0.0571   0.5393
0.3503   0.0914   0.5317   0.7833   0.4621
0.8228   0.1473   0.6018   0.5199   0.8622
inv(A):
0.0013   0.1741   0.9885   0.1662   0.8760
0.1933   0.7105   0.1191   0.4508   0.9559
0.5850   0.3040   0.0089   0.0571   0.5393
0.3503   0.0914   0.5317   0.7833   0.4621
0.8228   0.1473   0.6018   0.5199   0.8622
Process finished with exit code 0

Вопрос:

Почему не работает inv (ofAMatrix), какие-либо подсказки или идеи?
Спасибо!

2

Решение

Это прекрасно работает с Armadillo 7.900.1 с Intel (R) MKL бэкэнд и Clang 5.0.

Вы никогда не должны использовать обратную матрицу, если это не является абсолютно необходимым. Также вы должны убедиться, что обратное действительно существует, иначе алгоритм с удовольствием выведет мусор. Если вы хотите вычислить обратное найти Икс как в

Икс знак равно -1 б

лучше решить линейную систему

Икс знак равно б

вместо. Эти решатели намного быстрее и имеют лучшую сходимость.

#include <armadillo>

int main()
{
arma::mat A = { { 0.0013 , 0.1741 , 0.9885 , 0.1662 , 0.8760 } ,
{ 0.1933 , 0.7105 , 0.1191 , 0.4508 , 0.9559 } ,
{ 0.5850 , 0.3040 , 0.0089 , 0.0571 , 0.5393 } ,
{ 0.3503 , 0.0914 , 0.5317 , 0.7833 , 0.4621 } ,
{ 0.8228 , 0.1473 , 0.6018 , 0.5199 , 0.8622 } };
A.print("A: ");
arma::mat B = arma::inv(A);
B.print("inv(A): ");
arma::mat I = A*B;
I.print("I: ");
}

Выход:

A:
0.0013   0.1741   0.9885   0.1662   0.8760
0.1933   0.7105   0.1191   0.4508   0.9559
0.5850   0.3040   0.0089   0.0571   0.5393
0.3503   0.0914   0.5317   0.7833   0.4621
0.8228   0.1473   0.6018   0.5199   0.8622
inv(A):
0.4736   -1.7906    4.4377    2.2515   -2.4784
2.9108   -3.1697   12.1159    7.7356  -11.1675
2.5212   -2.8557    6.8074    4.7142   -6.1801
-1.0317    0.9400   -2.3230    0.2413    1.3297
-2.0869    3.6766   -9.6555   -6.9062    8.9447
I:
1.0000e+00   1.1340e-16  -1.8134e-15  -6.4918e-16  -4.8899e-17
7.6334e-17   1.0000e+00  -9.1810e-16  -9.4668e-16   8.7907e-16
2.5424e-16  -4.3981e-16   1.0000e+00   9.2981e-16  -2.0864e-15
9.3036e-17  -2.6745e-17   7.5137e-16   1.0000e+00  -8.1372e-16
4.3422e-16  -4.2293e-16   1.1321e-15   1.0687e-15   1.0000e+00
2

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

«Работает на меня», как они. Вождение это от R и RcppArmadillo:

Сначала мы читаем матрицу и используем обобщенное обратное значение из пакета MASS:

R> M <- as.matrix(read.table(text="0.0013   0.1741   0.9885   0.1662   0.8760
0.1933   0.7105   0.1191   0.4508   0.9559
0.5850   0.3040   0.0089   0.0571   0.5393
0.3503   0.0914   0.5317   0.7833   0.4621
0.8228   0.1473   0.6018   0.5199   0.8622"))
M <- as.matrix(read.table(text="0.0013   0.1741   0.9885   0.1662   0.8760
+    0.1933   0.7105   0.1191   0.4508   0.9559
+    0.5850   0.3040   0.0089   0.0571   0.5393
+    0.3503   0.0914   0.5317   0.7833   0.4621
+    0.8228   0.1473   0.6018   0.5199   0.8622"))
R> M
V1     V2     V3     V4     V5
[1,] 0.0013 0.1741 0.9885 0.1662 0.8760
[2,] 0.1933 0.7105 0.1191 0.4508 0.9559
[3,] 0.5850 0.3040 0.0089 0.0571 0.5393
[4,] 0.3503 0.0914 0.5317 0.7833 0.4621
[5,] 0.8228 0.1473 0.6018 0.5199 0.8622
R> MASS::ginv(M)
[,1]      [,2]     [,3]      [,4]      [,5]
[1,]  0.473579 -1.790599  4.43767  2.251542  -2.47842
[2,]  2.910752 -3.169657 12.11587  7.735612 -11.16755
[3,]  2.521167 -2.855651  6.80743  4.714239  -6.18015
[4,] -1.031667  0.940028 -2.32302  0.241345   1.32967
[5,] -2.086858  3.676647 -9.65548 -6.906203   8.94472
R>

Мы используем RcppArmadillo:

R> Rcpp::cppFunction("arma::mat armaInv(arma::mat x) { return arma::inv(x); }", depends="RcppArmadillo")
R> armaInv(M)
[,1]      [,2]     [,3]      [,4]      [,5]
[1,]  0.473579 -1.790599  4.43767  2.251542  -2.47842
[2,]  2.910752 -3.169657 12.11587  7.735612 -11.16755
[3,]  2.521167 -2.855651  6.80743  4.714239  -6.18015
[4,] -1.031667  0.940028 -2.32302  0.241345   1.32967
[5,] -2.086858  3.676647 -9.65548 -6.906203   8.94472
R>

Один и тот же ответ в обоих направлениях.

1

По вопросам рекламы [email protected]