5

GraphSlamで使用するnxn行列の逆行列を使用したいと思います。

私が遭遇した問題:

  • .inverse()Eigen-library(3.1.2)はゼロ値を許可せず、戻り値NaN
  • LAPACK(3.4.2)ライブラリでは、ゼロの行列式を使用できませんが、ゼロの値を使用できます(Cでlapackを使用して行列の逆行列を計算するサンプルコードを使用)
  • Seldonライブラリ(5.1.2)が何らかの理由でコンパイルされない

負のゼロ値とゼロの行列式を許可するnxn行列反転コードを正常実装した人はいますか?良いライブラリ(C ++)の推奨事項はありますか?

GraphSlamのオメガを次のように計算しようとしています:http: //www.acastano.com/others/udacity/cs_373_autonomous_car.html


簡単な例:

[ 1 -1  0 0 ]
[ -1 2 -1 0 ]
[ 0 -1  1 0 ]
[ 0  0  0 0 ]

実際の例は170x170で、0、負の値、より大きな正の値が含まれます。与えられた簡単な例は、コードをデバッグするために使用されます。


これはmatlab(Moore-Penrose pseudoinverse)で計算できますが、何らかの理由でC++でプログラムできません。

A = [1 -1 0 0; -1 2 -1 0; 0 -1 1 0; 0 0 0 0]
B = pinv(A)
B=
[0.56   -0.12  -0.44  0]
[-0.12  0.22   -0.11  0]
[-0.44  -0.11   0.56  0]
[0  0  0   0]

私のアプリケーションでは、(一時的に)ゼロのディメンションを削除できます。
したがって、4番目の列と4番目の行を削除します。
170x170のマトリックスでも同じことができますが、4x4は単なる例です。

A:

[ 1 -1  0 ]
[ -1 2 -1 ]
[ 0 -1  1 ]

したがって、4番目の列と4番目の行を削除しても、行列式はゼロになりません。しかし、私の行列が上記のようであれば、行列式をゼロにすることができます。これは、各行または各列の合計がゼロの場合です。(私はGraphSlamでずっと持っています)

LAPACKソリューション(Moore-Penrose Inverseベース)は、行列式がゼロでない場合に機能しました(Cでlapackを使用して行列の逆行列を計算するサンプルコードを使用)。
しかし、行列式がゼロの「疑似逆行列」として失敗しました。


解決策:(すべてのクレジットはFrankReininghausにあります)、SVD(特異値分解)を使用し ます
http://sourceware.org/ml/gsl-discuss/2008-q2/msg00013.html

  • ゼロ値(完全な0行と完全な0列でも)
  • 負の値
  • ゼロの行列式

A ^ -1:

[0.56   -0.12  -0.44]
[-0.12  0.22   -0.11]
[-0.44  -0.11   0.56]
4

4 に答える 4

7

Ax=B の形式の問題を解くこと (または A^-1 * b の形式の積を同等に計算すること) だけが必要な場合は、A の逆数または疑似逆数を計算するのではなく、 を直接解くことをお勧めします。 Ax=b は、適切なランク表示ソルバーを使用します。たとえば、Eigen を使用すると、次のようになります。

x = A.colPivHouseholderQr().solve(b);
x = A.jacobiSvd(ComputeThinU|ComputeThinV).solve(b);
于 2012-12-17T23:35:43.387 に答える
4

行列式がゼロであるため、Matlabコマンドは逆行列を計算しません。コマンドは、ムーア・ペンローズpinv疑似逆行列を計算します。のプロパティのすべてではありませんが、いくつかがあります。pinv(A)inv(A)

したがって、C++とMatlabで同じことをしているわけではありません。

私のコメントのように。今答えとして。可逆行列を反転することを確認する必要があります。つまり、

det A != 0

例の行列には、行列式がゼロに等しいものがあります。これは可逆行列ではありません。これを試してみないでください!

たとえば、ゼロエントリの完全な行または列がある場合、特定の行列には行列式ゼロがあります。

于 2012-12-17T18:28:20.253 に答える
2

マトリックスが可逆でないためではなく、ゼロ/負の値が原因であると確信していますか?

行列式が非ゼロの場合 ( mathworld link )、マトリックスには逆行列のみがあり、質問に投稿した行列の例にはゼロの行列式があるため、逆行列はありません。

これらのライブラリが与えられた行列の逆数を取ることを許可しない理由を説明する必要がありますが、同じ理由がフルサイズの 170x170 行列に当てはまるかどうかはわかりません。

于 2012-12-17T18:26:48.227 に答える
0

行列が一種の共分散または重み行列である場合、SVD の代わりに「一般化されたコレスキー逆変換」を使用できます。結果は、実用化に向けてより受け入れられるものになります。

于 2014-02-20T08:59:10.237 に答える