lu_factorize返回什么
What does lu_factorize return?
boost::number::ublas
包含M::size_type lu_factorize(M& m)
函数。它的名称表明它执行给定矩阵m
的LU分解,即应产生m=L*U的两个矩阵。似乎没有为此功能提供任何文档。
很容易推断,它返回0表示分解成功,当矩阵为奇异时返回非零值。然而,目前还不清楚结果如何。通过引用该矩阵表明它是有效的,但它应该产生两个矩阵(L和U),而不是一个
boost中没有文档,但查看SciPy的lu_factor
的文档可以看到,对于LU分解,返回一个结果并不罕见。
这就足够了,因为在LU分解的典型方法中,L对角线仅由1组成,例如,如数学中的答案所示。
因此,可以将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
自变量中。
首先求解z的Lz=e,其中z=Ux使用m
:的下部
inplace_solve(m, e, unit_lower_tag ());
然后,在计算出z=Ux(在e
修改到位的情况下)后,可以使用m
:的上部来求解Ux=e
inplace_solve(m, e, upper_tag ());
文件中提到了inplace_solve
,它是
求解具有三角形形式的线性方程组,即a为三角形。
所以一切似乎都有道理。
boost没有LU因子分解的文档(下三角矩阵L和上三角矩阵U),而是与公众共享的源代码。
如果代码很难理解,请查看Nick Higham的网页。它有详细的解释。以下是链接中的一个示例:
假设我们需要求解Ax=b。
(1)根据输入矩阵A生成LU
[3-1 1 1]
[-1 3 1-1]->
[-1-1 3 1]
[11113]
低
[1 0 0 0]
[-1/3 1 0 0]
[-1/3-1/2 1 0]
[1/3 1/2 0 1]
上部
[3-1 1 1]
[0 8/3 4/3-2/3]
[0 0 4 1]
[0 0 0 3]
这个例子直接面向人类,但在算法方面可能需要许多步骤。这就是LU Factorization出现的原因。方法上,与高斯消去的关系,舒尔补码,和块实现是一些。
(2)求解三角形系统Ly=b和Ux=y,因为那时b=L(Ux)。
- 什么时候在C++中返回常量引用是个好主意
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 我可以使用什么来停止循环而不是"返回 0"?
- 这个返回元素位置的基于循环的函数有什么问题?
- 查找不存在的键时,unordered_map返回什么
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- 如果我在 const 函数上使用指针,我可以返回什么?
- 基本的 c++ 问题:如果我在函数中创建某些内容并返回它会发生什么?
- 什么 /可以/ 你从一个函数返回. 并期望它在到达时还活着?
- 使用枚举作为条件,if 条件将返回什么,真或假?
- 当我使用 void 函数的返回值(通过强制转换函数指针)时,究竟会发生什么?
- 返回引用实例和非引用实例(return mystr & vs mystr)之间的区别是什么?
- 我应该返回什么而不是标准::shared_ptr<>&?
- 返回类型在 C++ OOP 中是什么意思
- 什么 & 返回左值或右值?
- 实际上什么返回类型有一个新的
- 链表缓冲区;应该插入什么返回
- 指针赋值应该使用什么返回类型?