在正半确定矩阵的Cholesky分解中正确使用枢轴

时间:2017-03-30 14:36:55

标签: r matrix matrix-factorization matrix-decomposition

我不明白如何使用R中的chol函数来计算正半正定矩阵。 (或者我做了,而且还有一个错误。)documentation州:

  

如果pivot = TRUE,则可以计算正半正定x的Choleski分解。 x的等级作为attr(Q," rank")返回,受数值误差的影响。枢轴以attr(Q," pivot")返回。不再是t(Q)%*%Q等于x的情况。但是,设置pivot< - attr(Q," pivot")和oo< - order(pivot),确实t(Q [,oo])%*%Q [,oo]等于x ...

以下示例似乎与此描述相符。

> x <- matrix(1, nrow=3, ncol=3)
> Q <- chol(x, pivot=TRUE)
> oo <- order(attr(Q, 'pivot'))
> t(Q[, oo]) %*% Q[, oo]
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1
[3,]    1    1    3

结果不是x。我是否错误地使用了枢轴?

1 个答案:

答案 0 :(得分:5)

对于满秩输入,即正定矩阵x,我们需要

Q <- chol(x, TRUE)
oo <- order(attr(Q, 'pivot'))
unpivQ <- Q[, oo]
all.equal(crossprod(unpivQ), x)

对于有效排名不足的输入,即正半正定矩阵x(具有负特征值的不定矩阵是非法的,但未在chol中检查),记住零缺陷尾随对角块:

Q <- chol(x, TRUE)
r <- attr(Q, 'rank')
if (r < nrow(x)) Q[(r+1):nrow(x), (r+1):nrow(x)] <- 0
oo <- order(attr(Q, 'pivot'))
unpivQ <- Q[, oo]
all.equal(crossprod(unpivQ), x)

有些人将此称为chol的“错误”,但实际上它是基础LAPACK例程dpstrf的一个功能。分解进行到第一个对角元素低于公差,使尾随矩阵在退出时不受影响。

感谢Ian的以下观察:

您可以在Q[-(1:r): -(1:r)] <- 0中使用R的否定索引来跳过if语句。