特征LDLT Cholesky分解到位
Eigen LDLT Cholesky decomposition in-place
我正在尝试使用Eigen3来求解具有局部Cholesky分解的线性系统A * X = B
。我负担不起在堆栈上推送任何A
大小的临时文件,但在此过程中我可以自由销毁A
。
不幸的是,
A.llt().solveInPlace(B);
因为A.llt()
在堆栈上隐式地推送A
大小的临时矩阵。对于LLT
的情况,我可以访问必要的功能,比如:
// solve A * X = B in-place for positive-definite A
template <typename AType, typename BType>
void AllInPlaceSolve(AType& A, BType& B)
{
typedef Eigen::internal::LLT_Traits<AType, Eigen::Upper> TraitsType;
TraitsType::inplace_decomposition(A);
TraitsType::getL(A).solveInPlace(B);
TraitsType::getU(A).solveInPlace(B);
}
这很好,但我担心:
- 我的矩阵
A
可能只是半正定的,在这种情况下需要LDLT分解 LLT
分解为系统的解计算不必要的sqrt()
我找不到一种方法来钩住Eigen的LDLT功能,类似于上面的代码,因为代码的结构非常不同。
所以我的问题是:有没有一种方法可以使用Eigen3来求解线性系统,使用LDLT分解,使用的划痕空间不比对角矩阵D
多?
一个选项是只分配一次LDLT解算器,并调用计算方法:
LDLT<MatType> ldlt(size);
// ...
ldlt.compute(A);
x = ldlt.solve(b);
如果这也不是一个选项,您可以constcast ldlt对象存储的矩阵:
LDLT<MatType> ldlt(MatType::Identity(size,size));
MatType& A = const_cast<MatType&>(ldlt.matrixLDLT());
播放A
,然后:
ldlt.compute(A);
x = ldlt.solve(b);
这很难看,但只要MatType
是列主,这就应该有效。
相关文章:
- 通过递归进行因子分解
- 有人能分解一下这个c++模板的语法吗
- C++ 乔列斯基因式分解
- Pytorch torch.cholesky忽略异常
- 如何加快本征C++中的LU分解?
- 如何将整数分解为不同的变量?
- 减少本征的 QR 分解
- Xcode 中的加速框架以获得 A 的 QR 分解,但找不到 zgeqrf
- 将无向连接图分解为两个组件
- 在 C++ 中分解数字
- 分解SWIG Python接口 - 容器会产生命名空间冲突
- 对模板参数包操作进行因素分解
- 之一卤化物中的Cholesky分解
- 使用特征来计算Cholesky分解
- C++,Lapack-Cholesky分解实现结果不准确
- 特征LDLT Cholesky分解到位
- 为什么 Eigen's Cholesky 分解在我的 Ubuntu 上很慢
- 特征c++中的Cholesky分解:如何一次性得到D向量和逆向量
- 为什么 Eigen's Cholesky 分解在 Linux 上比在 Windows 上快得多?
- cholesky分解ScaLapack错误