Eigen sparse solver wrong results(特征稀疏解算器错误结果)
本文介绍了特征稀疏解算器错误结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试用C++的本征库来解决一个稀疏线性系统Ax=B,但是下面这个简单的例子似乎给出了一个不正确的解决方案:
#include <Eigen/SparseCholesky>
#include <Eigen/Dense>
#include <Eigen/Sparse>
#include <iostream>
#include <vector>
using namespace std;
using namespace Eigen;
int main(){
SimplicialLDLT<SparseMatrix<double>> solver;
SparseMatrix<double> A(9,9);
typedef Triplet<double> T;
vector<T> triplet;
VectorXd B(9);
for(int i=0; i<4; i++){
triplet.push_back(T(i,i,1));
triplet.push_back(T(i+5,i+5,1));
}
triplet.push_back(T(4,1,-1));
triplet.push_back(T(4,3,-1));
triplet.push_back(T(4,5,-1));
triplet.push_back(T(4,7,-1));
triplet.push_back(T(4,4,4));
A.setFromTriplets(triplet.begin(),triplet.end());
B << 0,0,0,0,0.387049,0,0,0,0;
solver.compute(A);
VectorXd x = solver.solve(B);
cout << "A
" << A << "
";
cout << "B
" << B << "
";
cout << "x
" << x << "
";
return 0;
}
我看不到任何错误,算法返回&0&q;表示成功,但我得到的解决方案是
x = 0 0.193524 0 0.193524 0.193524 0 0 0 0
这显然不是此系统的解决方案,正确的解决方案是
x = 0 0 0 0 0.0967621 0 0 0 0
推荐答案
Here's documentationSimplicialLDLT
求解器:
此类提供了一个不含稀疏矩阵平方根的LDL^T Cholesky分解稀疏矩阵是自伴且是正定的。
当矩阵在元素中存储实数时,自伴==对称。你的矩阵显然不是对称的。而且,并不是每个对称矩阵都是正定的see examples。
简而言之,您选择的求解器仅适用于非常窄的矩阵类。正如您已经发现的,SparseLU
求解器适用于您的输入数据。
ConjugateGradient
求解器也不工作,它不要求矩阵是正定的,但it does要求它是自伴的。
这篇关于特征稀疏解算器错误结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:特征稀疏解算器错误结果


基础教程推荐
猜你喜欢
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- 设计字符串本地化的最佳方法 2022-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- C++,'if' 表达式中的变量声明 2021-01-01