我试图掌握可逆和不可逆矩阵的基本概念。
我创建了一个随机的非奇异方阵
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)
根据这个paper,我们也可以通过它的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
所以,再次根据相同的paper,我们可以使用SVD
i <- svd(I)
solve(i$u %*% diag(i$d) %*% t(i$v))
产生相同的错误。 然后我尝试使用Cholesky decomposition进行矩阵求逆
Conj(t(I))%*%solve(I%*%Conj(t(I)))
我再次得到同样的错误。
有人可以解释我在哪里使用方程式错误吗?
我知道对于矩阵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 solution
i$v%*%diag(1/i$d)%*%t(i$u)
Conj(t(I))%*%(I%*%Conj(t(I)))^(-1)
我不确定我是否正确解释了两个来源。