c++ - lu_factorize 返回什么?

标签 c++ boost matrix

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

很容易推导出它返回0表示分解成功,当矩阵为奇异时返回非零值。但是,完全不清楚结果在哪里。通过引用矩阵表明它可以就地工作,但是它应该产生两个矩阵(LU)而不是一个。那么它有什么作用呢?

最佳答案

boost里面没有文档,但是看SciPy's lu_factor 的文档可以看出,LU 分解返回一个结果的情况并不少见。

这就足够了,因为在LU 分解 的典型方法中,L 的对角线仅由 1 组成,如 this answer from Mathematics 中所示。 ,例如。

因此,可以将 LU 都放入一个矩阵中,将 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,其中 LU 都包含在其 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_solvethe 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/

相关文章:

python - 如何搜索矩阵中的连通元素?

c++ - initializer_list 和参数相关的查找

c++ - 将缓冲区内容复制到另一个缓冲区

python - Boost.Python 如何保存 C++ 类?

c++ - 将 boost::array<char> 复制到 std::string

c - 向前移动和矩阵中的索引

python - 定义仅在矩形子区域中具有非零元素的二维矩阵

C++ 在 Qt 中传递 Double 添加数字

c++ - 二叉树构造函数中的 EXC_BAD_ACCESS

c++ - 中断 boost 线程