【问题标题】:How to efficiently use inverse and determinant in Eigen?如何在 Eigen 中有效地使用逆和行列式?
【发布时间】:2014-12-09 17:50:23
【问题描述】:

在 Eigen 中有 recommendations 警告不要显式计算行列式和逆矩阵。

我正在使用正态逆愿望先验分布对多元正态进行后验预测。这可以表示为多元 t 分布。

在多元 t 分布中,您会找到一个术语 |Sigma|^{-1/2} 以及 (x-mu)^T Sigma^{-1} (x-mu)

我对本征一无所知。我可以想象对于一个半正定矩阵(它是一个协方差矩阵),我可以使用 LLT 求解器。

但是,求解器本身没有定义 .determinant().inverse() 方法。我是否必须使用 .matrixL() 函数并自己反转对角线上的元素以求逆,并计算乘积以获得行列式?我想我错过了什么。

【问题讨论】:

  • 您可以使用cholesky 分解来计算协方差矩阵的逆矩阵。这是有据可查的。
  • 我们可能需要看到更多的方程......我的直觉是,如果你转换为在雅可比/特征值分解空间中工作,你也许可以在那里进行整个计算密集矩阵求逆/行列式中固有的错误和时间复杂度将消失。
  • @Bathsheba 在 Eigen 中,LLT 求解器用于 Cholesky 分解。
  • @IdeaHat 完整的方程式有点复杂。它可以在Conjugate Bayesian analysis of the Gaussian distribution (2007) Murphy 中找到。后验预测是eq。 258. 多元 t 分布是 eq。 313. 我目前的实现可以在github找到。

标签: c++ eigen matrix-inverse determinants


【解决方案1】:

如果您有 Sigma=LL^T 的 Cholesky 分解并想要 (x-mu)^T*Sigma^{-1}*(x-mu),您可以计算:(llt.matrixL().solve(x-mu)).squaredNorm()(假设 xmu 是向量)。

对于行列式的平方根,只需计算llt.matrixL().determinant()(计算三角矩阵的行列式就是它的对角元素的乘积)。

【讨论】:

    猜你喜欢
    • 2019-12-01
    • 1970-01-01
    • 2016-03-28
    • 2023-03-18
    • 2014-11-13
    • 2023-03-21
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    相关资源
    最近更新 更多