boost::number::ublas
包含 M::size_type lu_factorize(M& m)
函数。它的名字表明它执行 LU decomposition给定矩阵 m
的,即应该产生两个 m = L*U 的矩阵。似乎没有为此功能提供文档。
很容易推导出它返回0表示分解成功,当矩阵为奇异时返回非零值。但是,完全不清楚结果在哪里。通过引用矩阵表明它可以就地工作,但是它应该产生两个矩阵(L 和U)而不是一个强>。那么它有什么作用呢?
最佳答案
boost里面没有文档,但是看SciPy's lu_factor
的文档可以看出,LU 分解返回一个结果的情况并不少见。
这就足够了,因为在LU 分解 的典型方法中,L 的对角线仅由 1 组成,如 this answer from Mathematics 中所示。 ,例如。
因此,可以将 L 和 U 都放入一个矩阵中,将 L 放在结果的下半部分,省略对角线 (假设只包含一个),上部是 U。例如,对于 3x3 问题,结果是:
u11 u12 u13
m = l21 u22 u23
l31 l32 u33
这意味着:
1 0 0
L = l21 1 0
l31 l32 1
和
u11 u12 u13
U = 0 u22 u23
0 0 u33
检查 boost 的 void lu_substitute(const M& m, vector_expression<E>& e)
来自同一命名空间的函数似乎证实了这一点。它求解方程 LUx = e,其中 L 和 U 都包含在其 m
中分两步论证。
首先使用 m
的下半部分求解 Lz = e z,其中 z = Ux :
inplace_solve(m, e, unit_lower_tag ());
然后,计算出 z = Ux(原地修改了 e
),可以使用 m
的上半部分求解 Ux = e :
inplace_solve(m, e, upper_tag ());
inplace_solve
在 the documentation 中提到,它:
Solves a system of linear equations with triangular form, i.e. A is triangular.
所以一切似乎都有道理。
关于c++ - lu_factorize 返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26404106/