当前位置: 首页 > 知识库问答 >
问题:

行列式为零的N×N矩阵的(伪)逆

公冶京
2023-03-14

我想取一个nxn矩阵的逆矩阵,用于我的GraphSlam。

我遇到的问题:

  • <代码>。inverse()特征库(3.1.2)不允许零值,返回NaN
  • LAPACK(3.4.2)库不允许使用零行列式,但允许使用零值(使用C中使用LAPACK计算矩阵逆的示例代码)
  • 由于某种原因,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 ]

所以去掉第四列和第四行不会得到零行列式。但如果我的矩阵如上所示,我仍然可以有一个零行列式。当每一行或每一列的总和为零时。(我会一直在GraphSlam)

如果行列式不为零,则LAPACK解(基于Moore-Penrose逆)有效(使用C中使用LAPACK计算矩阵逆的示例代码)<但作为行列式为零的“伪逆”失败

解决方案:(全部归功于Frank Reininghaus),使用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]

共有3个答案

叶琦
2023-03-14

你确定这是因为零/负值,而不是因为你的矩阵是不可逆的吗?

如果矩阵的行列式为非零(mathworld链接),则矩阵只有逆矩阵,并且您在问题中发布的矩阵示例具有零行列式,因此它没有逆矩阵。

这应该可以解释为什么那些库不允许你取给定矩阵的逆,但是我不能说同样的推理是否适用于你的全尺寸170x170矩阵。

嵇光临
2023-03-14

在这种情况下,Matlab命令不会计算逆矩阵,因为矩阵具有确定零。pinv命令计算摩尔-彭罗斯伪逆pinv(A)具有inv(A)的部分但不是全部属性。

所以你在C和Matlab中做的事情是不同的!

上一页

正如我的评论。现在作为答案。你必须确保你反转可逆矩阵。这意味着

det A!=0

您的示例矩阵的行列式等于零。这不是可逆矩阵。我希望你不要试这个!

例如,如果有一整行或整列的零条目,则给定矩阵的行列式为零。

严正初
2023-03-14

如果您只想解决形式Ax=B的问题(或等效计算形式A^-1*b的乘积),那么我建议您不要计算A的逆或伪逆,而是使用适当的秩揭示求解器直接求解Ax=b。例如,使用Eigen:

x = A.colPivHouseholderQr().solve(b);
x = A.jacobiSvd(ComputeThinU|ComputeThinV).solve(b);
 类似资料:
  • 我有一个家庭作业,要求我用用户输入生成一个n×n矩阵。我试过几种解决办法,但似乎都不管用。我想对你们中的许多人来说,这是一个相对简单的任务。 这是分配文本:编写一个方法,使用以下签名显示一个n×n矩阵:public static void printMatrix(int n)每个元素都是0或1,这是随机生成的。编写一个测试程序,提示用户输入n,并显示n×n矩阵。 我最近的尝试如下(显然我还没有调用

  • 本文向大家介绍java实现的n*n矩阵求值及求逆矩阵算法示例,包括了java实现的n*n矩阵求值及求逆矩阵算法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java实现的n*n矩阵求值及求逆矩阵算法。分享给大家供大家参考,具体如下: 先来看看运行结果: java版的写出来了,用的跟c语言相同的算法,然后看看能不能以后加个框做成程序: 更多关于java算法相关内容感兴趣的读者可查看本站

  • 我目前有以下问题,给定一个数组,为了简单起见,假设一个4 x 4数组(我实际上正在使用512 x 512) 我想在数组周围循环/滑动,这样我就可以在表单中保存新数组 < code>np.array([3,5],[7,6]),np.array([2,4],[8,8]),np.array([1,6],[2,1]),np.array ([7,7],[1,4])等等(理想情况下,我可以选择我的“滑动”窗口

  • 我想用极大值生成一个包含随机项的矩阵,这样矩阵的行列式就不会为零,然后进一步在Moodle的堆栈中实现这一点。我对Maxima(或任何与此相关的CA)的工作都是全新的,因此我一直在浏览我在网上找到的各种示例,到目前为止,我成功地做到了这一点: 生成具有0或1的2x2随机矩阵(出于简单性原因)并计算其行列式: 对于下一步,我想定义一个矩阵M2,如下所示: 如果矩阵M1的行列式已经不是零,好吧,我会同

  • 根据定义,行列式为零的方阵不应可逆。然而,出于某种原因,在生成协方差矩阵后,我成功地对其求逆,但求协方差矩阵的行列式的结果是输出为0.0。 可能会出现什么问题?我应该不信任行列式输出,还是应该不信任逆协方差矩阵?或者两者都有? 我的代码片段:

  • 我使用default_rng生成了这个数组: 我想用seed=5的生成器在这个矩阵中添加10个零。我想用dimessions[5,10]创建一个新数组,在里面放10个0,剩下的是一个,然后把两个数组混合起来,但是我必须使用生成器,所以我不能这样做。