从Eigen 3.3开始,LU,Cholesky和QR分解可以在适当的位置运行,即直接在给定的输入矩阵内运行。 在处理大型矩阵时,或者当可用内存非常有限时(嵌入式系统),此功能特别有用。为此,必须使用Ref <>矩阵类型实例化相应的分解类,并且必须使用输入矩阵作为参数来构造分解对象。 作为一个例子,让我们考虑使用部分旋转的就地LU分解。
这里,lu对象计算并存储由矩阵A保持的存储器中的L和U因子。因此,A的系数在因子分解期间被破坏,并且由L和U因子代替,因为可以验证:
由于存储器在A和lu之间共享,因此修改矩阵A将使lu无效。 通过修改A的内容并尝试再次解决初始问题,可以轻松验证这一点:
请注意,调用compute不会更改lu对象引用的内存。 因此,如果使用不同于A的另一个矩阵A1调用计算方法,则不会修改A1的内容。 这仍然是将用于存储矩阵A1的L和U因子的A的内容。 这可以很容易地验证如下:
矩阵A1不变,因此可以求解A1 * x = b,并直接检查残差而不需要A1的任何副本: