2017-06-13 4 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.私はエラーが発生していないのは奇妙なことではありませんか?それはリンカー/コンパイラの問題だろうか?あるいは、ライブラリがないのでしょうか? 3.残念ながら、私は逆を必要とし、私は逆が通常ボトルネックであることを認識しています、ありがとう! –

+1

「感謝」を掲示する代わりに[投票システム](https://stackoverflow.com/help/why-vote)を使用してください。しかし、とにかく、あなたは大歓迎です:) –

+0

MKLはIntelのLAPACKライ​​ブラリの実装で、そのプロセッサ用に特別な最適化を行っています。これはかなりのスピードアップを与えることができます。また、OpenMPを使用して多くのアルゴリズムを並列に実装していますので、速度が向上します。 –

0

は、彼らのように、 "私のための作品集"。 RとRcppArmadilloからこれを運転:

まず、行列を読み、MASSパッケージから一般逆を使用します。

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> 

同じ答え両方の方法:我々はRcppArmadillo使用

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> 

ザ・。

+0

素早い返答をありがとう、しかし私はRを使用していません。 –

+1

それは問題ではありません。アルマジロコードはアルマジロコードですが、私はRからそれを呼び出しましたが、両方とも同じLAPACKバックエンドを使用しています。だから、私はあなたに存在証拠を与えました:Armadilloに問題はありません。 –

+0

ありがとう、私は地元の問題であることを認識しています、それはアルマジロの問題ではないと確信していますが、問題の可能性について何か洞察に感謝します。 –

関連する問題