我尝试如下
l = l.triangularView<Lower>();
x1 = (l*l.transpose()).llt().solve(y1);
其中l,y1是输入矩阵和x1输出矩阵。输出按预期方式出现,但在这种情况下,l矩阵在执行第一个语句后发生变化。
我不想改变l矩阵
感谢您的任何建议。
答案 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>()
是分解结果。
要从x1
和l
计算y1
,您只需要求解两个三角方程。
x1 = l.triangularView<Lower>().conjugate().transpose().solve(
l.triangularView<Lower>().solve(y1)
);