R矩阵求逆的不一致积

时间:2018-10-24 03:18:59

标签: r matrix precision matrix-multiplication matrix-inverse

我有一个矩阵emat,它是通过求向量的外积之和而生成的。它应该是对称且正定的。我发现了

solve(emat) %*% solve(emat)

产生与

不同的结果
bmat <- solve(emat)
bmat %*% t(bmat)

实际上,两者之间有很大的不同(emat的打印输出缩短了R)。

> emat
        V1        V2        V3
1 170.2939  15.77391 110.75499
2  15.7739 444.57862   8.87082
3 110.7550   8.87082  72.03669
> solve(emat) %*% solve(emat) - bmat %*% t(bmat)
       1         2 3
V1 -1024  48.00000 0
V2     8  -0.21875 0
V3  2048 -72.00000 0

但是事实并非如此。

这是一个错误吗?还是精度问题?还是与R如何处理存储在内存中的矩阵有关?

2 个答案:

答案 0 :(得分:1)

问题可能出在您的emat矩阵上。我尝试过,它对我有用。

emat <- matrix(c(2,-1,0,-1,2,-1,0,-1,2),3,3)

# check your matrix to see if it is positive definite matrix or not
library(matrixcalc)
is.positive.definite(emat)

bmat <- solve(emat)

# the result of the following is zero matrix
solve(emat) %*% solve(emat) - bmat %*% t(bmat)

enter image description here

如果矩阵不是对称的(因此不是正定的),则结果将不为零,因为emat不等于t(emat)。

enter image description here

答案 1 :(得分:1)

您的emat矩阵不对称,请参见例如emat[1,2] != emat[2,1]

尝试运行

emat <- matrix(c(170.2939, 15.77391, 110.75499, 15.7739, 444.57862, 8.87082, 110.7550, 8.87082, 72.03669),ncol=3)
emat <- round(emat,4)
bmat <- solve(emat)

solve(emat) %*% solve(emat) - bmat %*% t(bmat)

在四舍五入时要注意数据是对称的(在此特定示例中,因为数据足够接近,因此在四舍五入后仍是相同的...)。