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]