lu_factorize返回什么?

Bar*_*zKP 5 c++ boost matrix

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

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

Bar*_*zKP 7

在boost中没有文档,但是查看SciPy的lu_factor文档可以看出,返回一个LU分解结果并不罕见.

这就足够了,因为在LU分解的典型方法中,L的对角线仅包含一个,例如,如数学答案中所示.

因此,可以将LU都放入一个矩阵中,将L放在结果的下半部分,省略对角线(假设只包含1个),并在上部放置U. 例如,对于3x3问题,结果是:

    u11 u12 u13
m = l21 u22 u23
    l31 l32 u33
Run Code Online (Sandbox Code Playgroud)

这意味着:

     1    0   0
L =  l21  1   0
     l31  l32 1
Run Code Online (Sandbox Code Playgroud)

    u11 u12 u13
U = 0   u22 u23
    0   0   u33
Run Code Online (Sandbox Code Playgroud)

void lu_substitute(const M& m, vector_expression<E>& e)从同一命名空间检查boost的功能似乎证实了这一点.它解决了方程LUx = e,其中LU分别包含m在两个步骤中.

首先使用下半部分解析Lz = e for z,其中z = Uxm:

inplace_solve(m, e, unit_lower_tag ());
Run Code Online (Sandbox Code Playgroud)

然后,计算z = Ux(e在适当的位置修改),Ux = e可以使用上半部分解决m:

inplace_solve(m, e, upper_tag ());
Run Code Online (Sandbox Code Playgroud)

inplace_solve文档中提到,它:

求解具有三角形形式的线性方程组,即A是三角形.

所以一切似乎都有意义.