我想在我的 GraphSlam 中使用 nxn 矩阵的逆矩阵。
我遇到的问题:
.inverse()
特征库(3.1.2)不允许零值,返回NaN
- LAPACK (3.4.2) 库不允许使用零行列式,但允许零值(使用示例代码来自Computing the inverse of a matrix using lapack in C)
- Seldon 库(5.1.2)由于某种原因无法编译
有没有人成功实现了一个允许负值、零值和零行列式的n x n矩阵求逆代码?有什么好的库(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 伪逆)中计算它,但由于某种原因,我无法在 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 逆)起作用(使用来自Computing the inverse of a matrix using lapack in C 的示例代码)。
但作为行列式为零的“伪逆”失败了。
解决方案:(全部归功于 Frank Reininghaus),使用 SVD(奇异值分解)
http://sourceware.org/ml/gsl-discuss/2008-q2/msg00013.html
适用于:
- 零值(即使是完整的 0 行和完整的 0 列)
- 负值
- 零的行列式
一个^-1:
[0.56 -0.12 -0.44]
[-0.12 0.22 -0.11]
[-0.44 -0.11 0.56]