在不使用中间矩阵或缓冲区的情况下,在特征中实现CholeskySolve的有效方法是什么?

时间:2016-07-11 11:34:09

标签: matrix eigen

我尝试如下

l = l.triangularView<Lower>();
x1 = (l*l.transpose()).llt().solve(y1);

其中l,y1是输入矩阵和x1输出矩阵。输出按预期方式出现,但在这种情况下,l矩阵在执行第一个语句后发生变化。
我不想改变l矩阵 感谢您的任何建议。

3 个答案:

答案 0 :(得分:1)

您已经拥有LLT因子分解,因此只需应用l的反转两次:

x = l.triangularView<Lower>().solve(y);
x = l.triangularView<Lower>().transpose().solve(x);

不是暂时的,一切都将在原地进行。

答案 1 :(得分:0)

您可以使用类似

的内容
(MatrixXf::Identity(l.rows(), l.cols()) * 
    l.triangularView<Lower>() * l.triangularView<Upper>())

丑陋,但由于某种原因,l.triangularView<Lower>() * l.triangularView<Upper>()无法正常工作(二进制operator*不采用左手类型的TriangularView,至少不使用Eigen 3.2.8)。

答案 2 :(得分:0)

您不需要Cholesky分解,因为下三角矩阵l.triangularView<Lower>()是分解结果。

要从x1l计算y1,您只需要求解两个三角方程。

x1 = l.triangularView<Lower>().conjugate().transpose().solve(
         l.triangularView<Lower>().solve(y1)
     );