我有以下矩阵
K <- matrix(c(1.250000e+00, 3.366892e-07, 4.641930e-10, 1.455736e-08, 1.049863e-06,
3.366892e-07, 1.250000e+00, 5.482775e-01, 8.606555e-01, 9.776887e-01,
4.641930e-10, 5.482775e-01, 1.250000e+00, 8.603413e-01, 4.246732e-01,
1.455736e-08, 8.606555e-01, 8.603413e-01, 1.250000e+00, 7.490100e-01,
1.049863e-06, 9.776887e-01, 4.246732e-01, 7.490100e-01, 1.250000e+00), nrow=5)
和以下向量
y <- matrix(c(39.13892, 12.34428, 12.38426, 14.71951, 10.52160), nrow=5)
我想计算K
的倒数与向量y
的乘积。
幼稚的方法有效(我有一种检查方法,但是在这里没关系)
solve(K) %*% y
[,1]
[1,] 31.3111308
[2,] 3.0620869
[3,] 3.7383357
[4,] 6.6257060
[5,] 0.7820081
但是“聪明”方法失败。我使用cholesky分解,这给了我一个上三角矩阵。然后,我通过后向替换解决系统L z = y
,并通过前向替换解决系统L^T x = L^{-1} y
。
L <- chol(K) ## upper triangular
forwardsolve(t(L), backsolve(L, y))
[,1]
[1,] 31.31112
[2,] -14.16259
[3,] 9.84534
[4,] 39.67900
[5,] 33.54842
发生了什么事?该矩阵K
和向量“ y”仅是示例。它与许多其他类似的向量和矩阵一起发生。为什么?
关键点是,当求积的逆时,必须对逆的积求逆:
solve(A %*% B) = solve(B) %*% solve(A)
问题中,顺序没有被颠倒。
如果为R = chol(K)
,请逐步进行:
solve(t(R) %*% R, y)
= solve(t(R) %*% R) %*% y
= solve(R) %*% solve(t(R)) %*% y
= solve(R) %*% solve(t(R), y)
= backsolve(R, forwardsolve(t(R), y))
我们可以检查一下是否确实与使用solve
直接给出的答案相同]
all.equal(backsolve(R, forwardsolve(t(R), y)), solve(K, y))
# [1] TRUE