【问题标题】:How to invert a full matrix?如何反转一个完整的矩阵?
【发布时间】:2020-02-14 22:18:19
【问题描述】:

我有一个矩阵

            X1         X2        X3        X4        X5        X6           G1            G2
X1            5         0         0         0         0         0            5            0 
X2            0         5         0         0         0         0            5            0
X3            0         0         5         0         0         0            5            0
X4            0         0         0         5         0         0            0            5
X5            0         0         0         0         5         0            0            5  
X6            0         0         0         0         0         5            0            5  
G1            5         5         5         0         0         0           15            0  
G2            0         0         0         5         5         5            0           15  

最后两行和最后两列存在线性依赖,我尝试删除一行和一列(例如G1),但是得到的矩阵仍然有线性依赖,所以无法反转矩阵。

谁能帮帮我?

【问题讨论】:

  • 你的预期输出是什么?
  • 你能举个小例子吗?我想并不是所有的行都是需要的。
  • 看来,矩阵的行列式是 0 - 所以,没有逆矩阵。

标签: r


【解决方案1】:

对称矩阵m,在最后的注释中重复显示,是奇异的,这意味着它具有至少一个零特征值(实际上,它有两个):

eigen(m)$values
## [1]  2.000000e+01  2.000000e+01  5.000000e+00  5.000000e+00  5.000000e+00
## [6]  5.000000e+00 -4.671248e-24 -4.671248e-24

因此,它不能倒置;但是,您可以使用 MASS 包中的 ginv 获取 Moore Penrose generalized inverse。广义逆确实满足下面最后一行代码中所示的关系。请注意,MASS 包随 R 一起提供,因此您无需安装它。

library(MASS)

gm <- ginv(m)
all.equal(m %*% gm %*% m, m)
## [1] TRUE

请注意,由于两个零特征值,存在两个线性依赖关系。通过检查我们注意到m 的前 3 行之和等于第 7 行,第 4 到第 6 行之和等于第 8 行,因此由于对称性而删除第 7 行和第 8 行以及相应的列,我们看到左上 6x6 子矩阵是可逆的:

solve(m[-(7:8), -(7:8)])

另外,我们可以通过检查m 的特征向量来找到约束。

注意

Lines <- "X1         X2        X3        X4        X5        X6           G1            G2
X1            5         0         0         0         0         0            5            0 
X2            0         5         0         0         0         0            5            0
X3            0         0         5         0         0         0            5            0
X4            0         0         0         5         0         0            0            5
X5            0         0         0         0         5         0            0            5  
X6            0         0         0         0         0         5            0            5  
G1            5         5         5         0         0         0           15            0  
G2            0         0         0         5         5         5            0           15"
m <- as.matrix(read.table(text = Lines))

【讨论】:

  • 或类似pinv(m),但需要安装包pracma :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多