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

本文介绍了一种使用Eigen库解决稀疏矩阵方程Ax=b的方法,包括矩阵A及向量b的初始化过程,以及如何利用SimplicialCholesky求解器求解未知向量x。

       众所周知,为了减小稀疏矩阵的存储内存,稀疏矩阵有专门的存储办法。但是怎么求解诸如 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;
}
运行结果如下:

要是有帮助到亲的话,可不要忘了给皮皮点个赞呢吐舌头

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值