2017-06-13 144 views
0

我正在使用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)工作,任何提示或想法? 謝謝!

回答

1

這適用於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 
+0

非常感謝您的回覆! 1.我不知道MKL是什麼。 2.我甚至沒有發現錯誤,這不奇怪嗎?它可能是一個鏈接器/編譯器問題?或者我錯過了一個圖書館?不幸的是,我確實需要反過來,我知道反向通常是一個瓶頸,謝謝! –

+1

請使用[投票系統](https://stackoverflow.com/help/why-vote),而不是張貼「謝謝」。但無論如何,歡迎您:) –

+0

MKL是英特爾對其處理器進行特殊優化的LAPACK庫的實現。這可以給你一些加速。還有許多算法是使用OpenMP並行實現的,這爲您提供了額外的速度。 –

0

「爲我的作品」,因爲它們。從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> 

相同的答案左右逢源。

+0

感謝您的快速回復,但我沒有使用R. –

+1

這並不重要。犰狳代碼是Armadillo代碼,我只是從R中調用它,並且它們都使用相同的LAPACK後端。所以我給了你一個存在證明:犰狳沒有問題,可能是你需要解決的地方問題。 –

+0

謝謝,我知道這是一個本地問題,我敢肯定這不是一個犰狳問題,但我會很感激任何問題的可能性,謝謝! –