Armadillo C++没有找到矩阵逆
我正在使用Armadillo & C++和我试图找到一个矩阵的逆,但是,逆刚刚返回矩阵本身。Armadillo C++没有找到矩阵逆
在我看来,没有任何计算。此外,没有错误抛出。
我使用下面的头:
#include <armadillo>
using namespace std;
using namespace arma;
,我一直在使用犰狳几天,并通过正常工作的几个矩阵操作跑去。
输入:
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)工作,任何提示或想法? 谢谢!
这适用于Armadillo 7.900.1和Intel (R) MKL后端和Clang 5.0。
除非绝对必要,否则绝不应该采用矩阵的逆。此外,您必须确保实际存在反向,否则算法将愉快地输出垃圾。如果你想计算的一个逆找到X在
X = 一个-1b
这是更好地解决线性系统
甲X = b
代替。这些求解器速度更快,收敛性更好。
#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
“为我的作品”,因为它们。从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>
相同的答案左右逢源。
感谢您的快速回复,但我没有使用R. –
这并不重要。犰狳代码是Armadillo代码,我只是从R中调用它,并且它们都使用相同的LAPACK后端。所以我给了你一个存在证明:犰狳没有问题,可能是你需要解决的地方问题。 –
谢谢,我知道这是一个本地问题,我敢肯定这不是一个犰狳问题,但我会很感激任何问题的可能性,谢谢! –
非常感谢您的回复! 1.我不知道MKL是什么。 2.我甚至没有发现错误,这不奇怪吗?它可能是一个链接器/编译器问题?或者我错过了一个图书馆?不幸的是,我确实需要反过来,我知道反向通常是一个瓶颈,谢谢! –
请使用[投票系统](https://*.com/help/why-vote),而不是张贴“谢谢”。但无论如何,欢迎您:) –
MKL是英特尔对其处理器进行特殊优化的LAPACK库的实现。这可以给你一些加速。还有许多算法是使用OpenMP并行实现的,这为您提供了额外的速度。 –