lu_factorize返回什么?

时间:2014-10-16 12:12:36

标签: c++ boost matrix

boost::number::ublas包含M::size_type lu_factorize(M& m)函数。它的名字表明它执行给定矩阵m的{​​{3}},即应该产生 m = L * U 的两个矩阵。似乎没有为此功能提供文档。

很容易推断它返回0表示成功分解,当矩阵是单数时返回非零值。但是,完全不清楚结果在哪里。通过引用获取矩阵表明它可以就地工作,但它应该产生两个矩阵( L U )而不是一个即可。那它做了什么?

1 个答案:

答案 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是三角形。

所以一切似乎都有意义。