您的位置:首页 > 编程语言

VS版Eigen库求解大型稀疏线性方程组

2017-11-17 12:01 831 查看
       众所周知,为了减小稀疏矩阵的存储内存,稀疏矩阵有专门的存储办法。但是怎么求解诸如 Ax=b(这里矩阵A为稀疏矩阵,假设x为列向量,b也为列向量)这样的方程组呢?求解这样的方程组分为两个步骤,一个是对稀疏矩阵A赋值,一个是用solve求解器求解方程组。

#include "stdafx.h"
#include<Eigen\Sparse>//包含稀疏矩阵求解;
#include<Eigen\Dense>
#include<vector>
#include<Windows.h>//调用sleep延迟函数;
#include<iostream>

typedef Eigen::SparseMatrix<double> SparseMatrixType;
typedef Eigen::Triplet<double> T;
typedef Eigen::SimplicialCholesky<SparseMatrixType> Solve;

int _tmain(int argc, _TCHAR* argv[])
{
int row_A, col_A,row_b;
col_A = 100; row_A = 100;
row_b = row_A;

//声明方程组的变量;
SparseMatrixType A(row_A,col_A);
Eigen::VectorXd x;
Eigen::VectorXd b;
std::vector<T> tripletlist;

//给向量b赋值;
b.resize(row_b);
for (int i = 0; i < row_b; i++)
{
b(i) = i + 1;
}

//给稀疏矩阵A赋值;
for (int i = 0; i < row_A; i++)
{
for (int j = 0; j < col_A; j++)
{
tripletlist.push_back(T((i + 3) % row_A, j, i + j));
tripletlist.push_back(T(i, j, i + 1));
}
}
A.setFromTriplets(tripletlist.begin(), tripletlist.end());
A.makeCompressed();

//求解;
Solve *p_A = new Solve(A);
x = p_A->solve(b);

for (int i = 0; i < x.size(); i++)
{
std::cout << x(i) << " ";
}
Sleep(20000);
return 0;
}
运行结果如下:



要是有帮助到亲的话,可不要忘了给皮皮点个赞呢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息