我试图掌握可逆和不可逆矩阵的基本概念。
我创建了一个随机的非奇异方阵
S <- matrix(rnorm(100, 0, 1), ncol = 10, nrow = 10)
我知道这个矩阵是正定的(因此是可逆的),因为当我将矩阵S
分解为其特征值时,它们的乘积是正的。
eig_S <- eigen(S)
eig_S$values
[1] 3.0883683+0.000000i -2.0577317+1.558181i -2.0577317-1.558181i 1.6884120+1.353997i 1.6884120-1.353997i
[6] -2.1295086+0.000000i 0.1805059+1.942696i 0.1805059-1.942696i -0.8874465+0.000000i 0.8528495+0.000000i
solve(S)
根据这篇论文,我们也可以通过其 SVD 计算非奇异矩阵的逆矩阵。哪里 (其中 U 和 V 是特征向量和 D 特征值,如果我错了,请纠正我)。
事实上,我可以在 R 中运行公式:
s <- svd(S)
s$v%*%solve(diag(s$d))%*%t(s$u)
产生与 完全相同的结果solve(S)
。
我的第一个问题是:
1) 是否s$d
确实代表 的特征值S
?因为s$d
和eig_S$values
完全不同。
现在第二部分,
如果我创建一个奇异矩阵
I <- matrix(rnorm(100, 0, 1), ncol = 5, nrow = 20)
I <- I%*%t(I)
eig_I <- eigen(I)
eig_I$values
[1] 3.750029e+01 2.489995e+01 1.554184e+01 1.120580e+01 8.674039e+00 3.082593e-15 5.529794e-16 3.227684e-16
[9] 2.834454e-16 5.876634e-17 -1.139421e-18 -2.304783e-17 -6.636508e-17 -7.309336e-17 -1.744084e-16 -2.561197e-16
[17] -3.075499e-16 -4.150320e-16 -7.164553e-16 -3.727682e-15
求解函数会产生错误
solve(I)
系统在计算上是奇异的:倒数条件数 = 1.61045e-19
所以,再次根据同一篇论文,我们可以使用 SVD
i <- svd(I)
solve(i$u %*% diag(i$d) %*% t(i$v))
这会产生相同的错误。然后我尝试使用Cholesky 分解进行矩阵求逆
Conj(t(I))%*%solve(I%*%Conj(t(I)))
我又得到了同样的错误。
有人可以解释一下我在哪里使用了错误的方程式吗?
我知道对于 matrix I%*%Conj(t(I))
,特征值矩阵的行列式是正的,但由于我所做的初始乘法,矩阵不是满秩。
j <- eigen(I%*%Conj(t(I)))
det(diag(j$values))
[1] 3.17708e-196
qr(I %*% Conj(t(I)))$rank
[1] 5
更新1:在下面的评论之后,再次浏览论文/维基百科页面之后。我使用了这两个代码,它们产生了一些结果,但我不确定它们的有效性。第一个例子似乎更可信。SVD解决方案
i$v%*%diag(1/i$d)%*%t(i$u)
和乔尔斯基
Conj(t(I))%*%(I%*%Conj(t(I)))^(-1)
我不确定我是否正确解释了这两个来源。