我有一个矩阵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如何处理存储在内存中的矩阵有关?
答案 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)
如果矩阵不是对称的(因此不是正定的),则结果将不为零,因为emat不等于t(emat)。
答案 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)
在四舍五入时要注意数据是对称的(在此特定示例中,因为数据足够接近,因此在四舍五入后仍是相同的...)。