Eigen教程5 - 求解稀疏线性方程组

2023-05-16

博客新址: http://blog.xuezhisd.top
邮箱:xuezhisd@126.com


  • Eigen中有一些求解稀疏系数矩阵的线性方程组。由于稀疏矩阵的特殊的表示方式,因此获得较好的性能需要格外注意。查看《Eigen教程3 - 稀疏矩阵操作》,了解更多有关稀疏矩阵的内容。
  • 本文列出了Eigen中的稀疏求解器。同时也介绍了所有线性求解器的共同步骤。
  • 用户可以根据矩阵的性质,准确度的要求,来调整求解步骤,以提升代码的性能。
  • 注意:没有必要深入了解这些步骤后面隐藏的内容。
  • 本文最后一部分列出了一个基准例程,可以用于窥探所有的求解器的性能。

稀疏求解器的列表

  • Eigen提供了一系列的内建求解器和封装了一些外部求解器库。

内建的直接求解器

头文件求解器类型矩阵类型关于性能的特性许可证备注
SimplicialLLT#include<Eigen/SparseCholesky>直接LLT分解SPDFill-in reducingLGPL一般使用它
SimplicialLDLT#include<Eigen/SparseCholesky>直接LDLT分解SPDFill-in reducingLGPL当矩阵非常稀疏,且问题不太大时使用它
SparseLU#include<Eigen/SparseLU>LU分解方阵Fill-in reducing,Leverage fast dense algebraMPL2对于不规则小或大问题进行了优化
SparseQR#include<Eigen/SparseQR>QR分解任意,矩形Fill-in reducingMPL2推荐最小方差问题使用,

内建的迭代求解器

头文件求解器类型矩阵类型Supported preconditioners, [default]许可证备注
ConjugateGradient#include<Eigen/IterativeLinearSolvers>经典的迭代共轭梯度SPDIdentityPreconditioner, [DiagonalPreconditioner], IncompleteCholeskyMPL2适用于大对称矩阵问题(比如,3D泊松)
LeastSquaresConjugateGradient#include<Eigen/IterativeLinearSolvers>矩形最小方差问题的共轭梯度矩形IdentityPreconditioner, [LeastSquareDiagonalPreconditioner]MPL2在不计算A’A的情况下,求解 $min |A'Ax-b|^2$
BiCGSTAB#include<Eigen/IterativeLinearSolvers>Iterative stabilized bi-conjugate gradient方阵IdentityPreconditioner, [DiagonalPreconditioner], IncompleteLUTMPL2为了加速收敛,尝试使用 IncompleteLUT preconditioner

对第三方求解器的封装

模块求解器类型矩阵类型有关性能的特性依赖,许可证备注
PastixLLT, PastixLDLT, PastixLUPaStiXSupport直接LLT,LDLT,LU分解SPD,SPD,SquareFill-in reducing, Leverage fast dense algebra, 多线程需要PaStiX,CeCILL-C对于难题和对称模式进行了优化
CholmodSupernodalLLTCholmodSupport直接LLT分解SPDFill-in reducing, Leverage fast dense algebra需要SuiteSparse,GPL
UmfPackLUUmfPackSupport直接LU分解SquareFill-in reducing, Leverage fast dense algebra需要SuiteSparse,GPL
SuperLUSuperLUSupport直接LU分解方阵Fill-in reducing, Leverage fast dense algebra需要SuperLU,(BSD-like)
SPQRSPQRSupportQR分解任意,矩形fill-in reducing, 多线程,fast dense algebra需要SuiteSparse,GPL适用于线性最小方差问题,has a rank-revealing feature
PardisoLLT,PardisoLDLT,PardisoLUPardisoSupport直接LLT,LDLT,LU分解SPD,SPD,方阵Fill-in reducing, Leverage fast dense algebra, 多线程需要 Intel MKL,Proprietary对于难题模式进行了优化,详情查阅 using MKL with Eigen
  • 说明:此处的SPD (symmetric positive definite) 表示对称正定。

稀疏求解器的概念

  • 所有的求解器遵循相同的概念,下面是一个典型的例子。
#include <Eigen/RequiredModuleName>
// ...
SparseMatrix<double> A;
// fill A
VectorXd b, x;
// fill b
// solve Ax = b
SolverClassName<SparseMatrix<double> > solver;
solver.compute(A);
if(solver.info()!=Success) {
  // decomposition failed
  return;
}
x = solver.solve(b);
if(solver.info()!=Success) {
  // solving failed
  return;
}
// solve for another right hand side:
x1 = solver.solve(b1);
  • 对于SPD求解器,允许指定第二个模板参数来决定使用哪一个三角部分(上三角或下三角)。比如:
ConjugateGradient<SparseMatrix<double>, Eigen::Upper> solver;
x = solver.compute(A).solve(b);
  • 上面的代码仅使用了A的上三角部分进行求解。相对的三角部分可能为空,也可能包含任意值。
  • 当需要求解具有相同稀疏模式的多个问题时,可以将compute()函数拆解成2步:
SolverClassName<SparseMatrix<double> > solver;
solver.analyzePattern(A);   // 在这一步中,A的数值并未使用
solver.factorize(A);
x1 = solver.solve(b1);
x2 = solver.solve(b2);
...
A = ...;                    // 修改A中非零元素的值,但并未改变非零模式
solver.factorize(A);
x1 = solver.solve(b1);
x2 = solver.solve(b2);
  • compute()方法等价于analyzePattern() 加 factorize()。
  • 每一个求解器提供了一些特性,比如行列式,访问因子和控制迭代等。
  • 绝大多数的迭代求解器,也可以用于matrix-free context。

计算步骤

  • 在compute()函数中,将对矩阵进行分解。LLT(三角矩阵分解)用于自伴随矩阵,LDLT用于Hermitian矩阵,LU用于非Hermitian矩阵,QR用于矩形矩阵。为了更加精确的求解,compute ()函数计算步骤又进一步细分为2步:analyzePattern() 和 factorize()。
  • analyzePattern()的目的是为了记录矩阵中的非零元素,以便分解步骤中创建更少的fill-in。这一步仅仅使用了矩阵的结构。因此,这一步的结果也可用于具有相同结构的其它线性方程组。注意,一些第三方求解器(比如,SuperLU)在本步中需要矩阵的元素值,比如为了平衡矩阵的行和列。这种情形下,这一步的结果不能用于其它线性方程组(矩阵)。
  • Eigen提供了有限的几种方法在本步来记录矩阵。内建方法(COLAMD,AMD),第三方方法(METIS)。这些方法可以通过设置求解器的模板参数进行设置:
DirectSolverClassName<SparseMatrix<double>, OrderingMethod<IndexType> > solver;
  • 在factorize()中,计算系数矩阵的因子。只要矩阵的值发生变化,就需要调用该函数。然而在多次调用之间,应该保证矩阵的结构不变化。

  • 对于迭代求解器,compute()步骤是用于设置preconditioner。比如使用ILUT preconditioner的求解器,就是在计算步骤中计算非完备因子L和U。记住一点:一般preconditioner都是为了加速迭代方法收敛的速度。Eigen可以通过给迭代求解器对象添加一个模板参数,来选择一个preconditioner:

IterativeSolverClassName<SparseMatrix<double>, PreconditionerName<SparseMatrix<double> > solver; 
  • 成员函数preconditioner()返回一个preconditioner 的可读写的引用。

求解步骤

  • solve()函数计算线性方程组的解。等号右边可以是一个向量,也可以是多个向量(矩阵)。
X = solver.solve(B);
  • 此处B是一个向量或矩阵。
  • 可以多次调用solve()函数。
x1 = solver.solve(b1);
// Get the second right hand side b2
x2 = solver.solve(b2); 
  • 直接求解方法的计算结果是机器最小误差。有时结果没必要如此精确,这时,迭代方法更加适用。可以通过setTolerance()来设置希望的误差。

基准例程

  • 绝大多数时候,你只需知道求解你的线性方程组需要的时间和最适合的求解器是什么。Eigen提供了一个基准例程来实现这个功能。

  • 位置:bench/spbench/

  • 编译命令:make spbenchsolver

  • 矩阵格式: MatrixMarket Coordinate format

  • 该程序将返回所有求解器的花费时间统计信息

  • 通过使用SparseExtra模块(非官方支持),可以将矩阵和等号右边向量转换成matrix-market格式。

#include <unsupported/Eigen/SparseExtra>
...
Eigen::saveMarket(A, "filename.mtx");
Eigen::saveMarket(A, "filename_SPD.mtx", Eigen::Symmetric); // if A is symmetric-positive-definite
Eigen::saveMarketVector(B, "filename_b.mtx");

参考

  • http://eigen.tuxfamily.org/dox/group__TopicSparseSystems.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Eigen教程5 - 求解稀疏线性方程组 的相关文章

  • global命令详解

    发信人 vale 浅谷 信区 VIM 标 题 global命令详解 发信站 水木社区 Fri Jun 15 17 05 55 2007 站内 global命令是Vim最强大的命令之一 xff08 个人认为是No 1 xff09 xff0c
  • [简单总结] WiFi中的RTS和CTS简单回顾

    通信协议中的RTS CTS协议 xff1a 即请求发送 允许发送协议 xff0c 相当于一种握手协议 xff0c 主要用来解决 34 隐藏终端 34 问题 34 隐藏终端 34 xff08 Hidden Stations xff09 是指
  • 蓝牙技术谈之跳频技术(一)

    跳频技术 Frequency Hopping Spread Spectrum xff1b FHSS 在同步 且同时的情况下 xff0c 接收两端以特定型式的窄频载波来传送讯号 xff0c 对于一个非特定的接收器 xff0c FHSS所产生的
  • Ubuntu自学笔记二

    磁盘管理 dev sd 文件 xff0c 此类文件是磁盘设备文件 xff0c 并不能直接访问磁盘 xff0c 必须要将磁盘挂载到某一个目录下才可以访问 dev sdb和 dev sdb1是U盘的设备文件 xff08 每个人的电脑U盘设备文件
  • 机器视觉设计,如何正确的选择相机和镜头?

    1 相机选择步骤 xff1a 目标物尺码 61 预估实际视场 0 75 根据精度算出分辨率 xff0c 预计出的实际视场 项目要求精度 61 相机的分辨率 根据相机分辨率大小 xff0c 选择合适的相机 xff0c 如果分别率一样的情况下
  • VCC、VDD、VSS以及VBAT的区别

    在STM32 的学习中 xff0c 发现有几种看起来相关的名称 xff0c 分别是VCC VDD VSS VBAT xff0c 在经过搜索查找之后 xff0c 总结如下 xff1a 1 VCC的C是Circuit的意思 xff0c 是指整个
  • vue中单个js写法

    1 vue export default 可以写很多东西 xff0c 包括变量和方法 xff0c 对象等 xff0c 只要是想作为开放的接口都可以写 xff0c 在 vue文件中一般写上data 以及method等 xff0c data指的
  • Ubuntu14.04安装Theano详细教程

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 因为最近需要学习深度学习 xff0c 因此想要配置Theano xff0c 来开发深度学习算法 但是发现Theano安装总是出
  • Ubuntu-安装-cuda7.0-单显卡-超详细教程

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 一 说明 本教程是在台式机上安装的 xff0c 只有一个NVIDIA显卡 操作系统是Ubuntu 14 04 64bit 双显
  • 使用Putty无法远程登录,显示服务器拒绝连接

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com putty连接不到linux的原因总结为以下几种情况 局域网内的两台电脑IP冲突 当使用DHCP自动分配IP时 xff0c 两
  • caffe安装系列——综述

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 说明 网上关于caffe的安装教程非常多 xff0c 但是关于每一步是否操作成功 xff0c 出现了什么样的错误又该如何处理没
  • ls改头换面

    在linux中 xff0c ls命令可以使用颜色来区别不同的文件 路径 权限等等 但是有时候 xff0c ls的颜色配置不是非常合适 例如在黑色的背景下显示蓝色的文字 xff0c 看起来真是费劲啊 要修改颜色配置非常简单 xff0c 可以修
  • caffe安装系列——安装GCC4.7和G++4.7并降级

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 说明 网上关于caffe的安装教程非常多 xff0c 但是关于每一步是否操作成功 xff0c 出现了什么样的错误又该如何处理没
  • caffe安装系列——安装NVIDIA显卡驱动

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 说明 网上关于caffe的安装教程非常多 xff0c 但是关于每一步是否操作成功 xff0c 出现了什么样的错误又该如何处理没
  • caffe安装系列——安装cuda和cudnn

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 说明 网上关于caffe的安装教程非常多 xff0c 但是关于每一步是否操作成功 xff0c 出现了什么样的错误又该如何处理没
  • caffe安装系列——安装Matlab

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 说明 网上关于caffe的安装教程非常多 xff0c 但是关于每一步是否操作成功 xff0c 出现了什么样的错误又该如何处理没
  • caffe安装系列——安装OpenCV

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 说明 网上关于caffe的安装教程非常多 xff0c 但是关于每一步是否操作成功 xff0c 出现了什么样的错误又该如何处理没
  • caffe安装系列——安装python依赖包

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 说明 网上关于caffe的安装教程非常多 xff0c 但是关于每一步是否操作成功 xff0c 出现了什么样的错误又该如何处理没
  • caffe安装系列——安装caffe

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 说明 网上关于caffe的安装教程非常多 xff0c 但是关于每一步是否操作成功 xff0c 出现了什么样的错误又该如何处理没
  • 服务器维护系列——VNC没有反应了怎么办?

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 服务器维护系列 服务器维护系列 VNC没有反应了怎么办 xff1f 问题描述 服务器上存在多个用户 xff0c 大家通过VNC

随机推荐

  • PCL系列——读入PCD格式文件

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • PCL系列——将点云数据写入PCD格式文件

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • awk one lines

    From http www student northpark edu pemente awk awk1line txt HANDY ONE LINERS FOR AWK 22 July 2003 compiled by Eric Peme
  • PCL系列——拼接两个点云

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • PCL系列——从深度图像(RangeImage)中提取NARF关键点

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • PCL系列——如何可视化深度图像

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • PCL系列——如何使用迭代最近点法(ICP)配准

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • PCL系列——如何逐渐地配准一对点云

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • PCL系列——三维重构之泊松重构

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • PCL系列——三维重构之贪婪三角投影算法

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • PCL系列——三维重构之移动立方体算法

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com PCL系列 PCL系列 读入PCD格式文件操作PCL系列 将点云数据写入PCD格式文件PCL系列 拼接两个点云PCL系列 从深
  • 解决Ubuntu中文显示为乱码

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 1 安装所需软件 sudo apt get install zh autoconvert sudo apt get insta
  • hexo教程系列——hexo安装教程

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 本文详细描述了如何在Github上 xff0c 使用hexo部署博客 安装Hexo 安装node js node js官方下载
  • Python中类成员函数均为虚函数的理解

    python中类成员函数均为虚函数 我们可以通过下面的函数见识其威力 class A def foo self print 39 a 39 class B A def foo self print 39 b 39 for x in A B
  • MxNet系列——Windows上安装MxNet

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 开发环境 操作系统 xff1a Win7 64bit C 43 43 编译器 xff1a Visual Studio 2010
  • Eigen教程1 - 基础

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 固定大小的矩阵和向量 参考链接 xff1a http eigen tuxfamily org dox 2 0 Tutorial
  • Eigen教程2 - 入门

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 安装Eigen 无需安装 只需将Eigen位置添加到include路径中 Demo 1 MatrixXd xff0c X表示动
  • Eigen教程3 - 稀疏矩阵操作

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 稀疏矩阵操作 操作和求解稀疏问题需要的模块 xff1a SparseCore SparseMatrix 和 SparseVec
  • Eigen教程4 - 稀疏矩阵快速参考指南

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com 本文对稀疏矩阵SparseMatrix的主要操作进行了总结 首先 xff0c 建议先阅读 Eigen教程2 稀疏矩阵操作 关于
  • Eigen教程5 - 求解稀疏线性方程组

    博客新址 http blog xuezhisd top 邮箱 xff1a xuezhisd 64 126 com Eigen中有一些求解稀疏系数矩阵的线性方程组 由于稀疏矩阵的特殊的表示方式 xff0c 因此获得较好的性能需要格外注意 查看