我想要对一个nxn矩阵取逆来在我的GraphSlam中使用。
我遇到的问题是:
我试图在GraphSlam中计算以下omega: http://www.acastano.com/others/udacity/cs_373_autonomous_car.html
对于我的应用程序,我可以(暂时)去掉零维度。
因此,我将删除第4列和第4行。
我也可以对我的170x170矩阵进行操作,4x4只是一个示例。
我遇到的问题是:
- .inverse() Eigen库(3.1.2)不允许零值,返回NaN
- LAPACK库(3.4.2)不允许使用零行列式,但允许零值(使用自Computing the inverse of a matrix using lapack in C的示例代码)
- Seldon库(5.1.2)因某种原因无法编译
我试图在GraphSlam中计算以下omega: 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只是一个示例。
[ 1 -1 0 ]
[ -1 2 -1 ]
[ 0 -1 1 ]
如果删除第四列和第四行,行列式不会为零。但是如果我的矩阵如上所示,仍然可能有零行列式。当每行或每列的总和为零时就会出现这种情况(在GraphSlam中我经常会遇到这种情况)
如果行列式不为零,则基于Moore-Penrose伪逆的LAPACK解决方案可行(使用Computing the inverse of a matrix using lapack in C的示例代码)。但是如果行列式为零,则作为“伪逆”失败。
解决方案:(所有功劳归功于Frank Reininghaus),使用奇异值分解(SVD)
http://sourceware.org/ml/gsl-discuss/2008-q2/msg00013.html
适用于:
- 零值(甚至完全为0的行和列)
- 负值
- 行列式为零
A^-1:
[0.56 -0.12 -0.44]
[-0.12 0.22 -0.11]
[-0.44 -0.11 0.56]