boost::number::ublas
包含M::size_type lu_factorize(M& m)
函数。它的名字表明它执行给定矩阵m
的{{3}},即应该产生 m = L * U 的两个矩阵。似乎没有为此功能提供文档。
很容易推断它返回0表示成功分解,当矩阵是单数时返回非零值。但是,完全不清楚结果在哪里。通过引用获取矩阵表明它可以就地工作,但它应该产生两个矩阵( L 和 U )而不是一个即可。那它做了什么?
答案 0 :(得分:7)
在boost中没有文档,但查看SciPy's lu_factor
的文档可以看出,为 LU返回一个结果并不罕见分解
这就足够了,因为在 LU分解的典型方法中, L 的对角线仅包含一个,如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
的下半部分解决 z 的 Lz = e ,其中 z = Ux :
inplace_solve(m, e, unit_lower_tag ());
然后,计算出 z = Ux (在e
修改后), Ux = e 可以使用{{1}的上半部分来解决}}:
m
the documentation中提到了{p> inplace_solve(m, e, upper_tag ());
,并且:
求解具有三角形形式的线性方程组,即A是三角形。
所以一切似乎都有意义。