[Eigen中文文档] 求解稀疏线性系统

news2025/1/10 11:53:54

文档总目录

本文目录

      • 稀疏求解器列表
        • 内置直接求解器
        • 内置迭代求解器
        • 外部求解器的包装器
      • 稀疏求解器概念
      • 计算步骤
      • 基准测试例程

英文原文(Solving Sparse Linear Systems)

在Eigen中,有多种方法可用于求解稀疏系数矩阵的线性系统。由于此类矩阵的特殊表示,必须特别小心以获得良好的性能。有关Eigen中稀疏矩阵的详细介绍,请参见“[稀疏矩阵操作](#5.1 稀疏矩阵操作)”。本页列出了Eigen中可用的稀疏求解器。还介绍了所有这些线性求解器共同的主要步骤。根据矩阵的属性、所需的准确度,最终用户可以调整这些步骤以提高其代码的性能。请注意,并不需要深入了解这些步骤背后的内容:最后一节介绍了一个基础例程,可轻松使用以获取所有可用求解器的性能洞察。

稀疏求解器列表

Eigen 目前提供了一组广泛的内置求解器,以及外部求解器库的包装器。它们总结在下表中:

内置直接求解器

类及头文件求解器种类矩阵种类与性能相关的功能备注
SimplicialLLT
#include<Eigen/SparseCholesky>
直接LLt分解对称正定(SPD)通过对矩阵的重排列、消元等操作,来减少生成的新元素,以减少计算时间和空间。(Fill-in reducing)SimplicLDLT 通常更可取
SimplicialLDLT
#include<Eigen/SparseCholesky>
直接 LDLt 分解对称正定(SPD)Fill-in reducing推荐用于非常稀疏且不太大的问题(例如,2D 泊松方程)
SparseLU
#include<Eigen/SparseLU>
LU 分解方阵快速的密集代数运算,包括基于GPU的加速、多线程优化、并行计算等。(Leverage fast dense algebra)、Fill-in reducing针对不规则模式的大小问题进行了优化
SparseQR
#include<Eigen/SparseQR>
QR 分解矩形阵Fill-in reducing推荐用于最小二乘问题,具有基本的秩显示特性。

内置迭代求解器

类及头文件求解器种类矩阵种类默认支持的预处理器备注
ConjugateGradient
#include<Eigen/IterativeLinearSolvers>
经典共轭梯度法(CG)SPD IdentityPreconditioner, [DiagonalPreconditioner], IncompleteCholesky推荐用于大型对称问题(例如 3D 泊松方程)
LeastSquaresConjugateGradient
#include<Eigen/IterativeLinearSolvers>
矩形阵最小二乘问题的 CG矩形阵 IdentityPreconditioner, [LeastSquareDiagonalPreconditioner]求解 $min
BiCGSTAB
#include<Eigen/IterativeLinearSolvers>
迭代稳定双共轭梯度方阵IdentityPreconditioner, [DiagonalPreconditioner], IncompleteLUT要加速收敛,请尝试使用 IncompleteLUT 预调节器。
  • 共轭梯度法:(Conjugate Gradient method,简称CG),它是一种迭代求解线性方程组的方法。CG方法通常用于解决大规模稀疏对称正定线性方程组,具有高效、收敛快等优点。在Classic iterative CG中,每次迭代会得到一个新的解向量,同时利用前一次的残差和搜索方向来求解下一次的迭代解。
  • 稳定双共轭梯度法:是求解非对称矩阵线性方程组(Ax = b)的迭代算法。与传统的共轭梯度法不同,稳定双共轭梯度法可以处理非对称矩阵的情况,并且在求解过程中,该方法可以保持数值稳定性,避免出现数值震荡等问题。该方法的主要思路是采用两条共轭的方向(与传统共轭梯度法相同)来求解线性方程组,但在每次迭代过程中,引入了一个稳定因子,该稳定因子的作用是保持迭代过程的数值稳定性。该稳定因子可以通过计算残差向量和搜索方向向量之间的内积来确定。

外部求解器的包装器

模块求解器类型矩阵类型与性能相关的功能依赖/证书备注
PastixLLT
PastixLDLT
PastixLU
PaStiXSupportDirect LLt, LDLt, LU factorizationsSPD
SPD
方阵
Fill-in reducing, Leverage fast dense algebra, MultithreadingRequires the PaStiX package, CeCILL-C针对棘手问题和对称模式进行了优化
CholmodSupernodalLLTCholmodSupportDirect LLt factorizationSPDFill-in reducing, Leverage fast dense algebraRequires the SuiteSparse package, GPL
UmfPackLU UmfPackSupportDirect LU factorization方阵Fill-in reducing, Leverage fast dense algebraRequires the SuiteSparse package, GPL
KLU KLUSupportDirect LU factorization方阵Fill-in reducing, suitted for circuit simulationRequires the SuiteSparse package, GPL
SuperLUSuperLUSupportDirect LU factorization方阵Fill-in reducing, Leverage fast dense algebraRequires the SuperLU library, (BSD-like)
SPQR SPQRSupportQR factorization矩形阵fill-in reducing, multithreaded, fast dense algebraRequires the SuiteSparse package, GPL推荐用于最小二乘问题,具有基本的秩显示特性。
PardisoLLT
PardisoLDLT
PardisoLU
PardisoSupportDirect LLt, LDLt, LU factorizationsSPD
SPD
方阵
Fill-in reducing, Leverage fast dense algebra, MultithreadingRequires the Intel MKL package, Proprietary针对棘手问题模式进行了优化,另请参阅将 MKL 与 Eigen 结合使用
AccelerateLLT
AccelerateLDLT
AccelerateQR
AccelerateSupportDirect LLt, LDLt, QR factorizationsSPD
SPD
方阵
Fill-in reducing, Leverage fast dense algebra, MultithreadingRequires the Apple Accelerate package, Proprietary

这里SPD的意思是对称正定。

稀疏求解器概念

所有这些求解器都遵循相同的一般概念。这是一个典型且普遍的例子:

#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 求解器,第二个可选模板参数允许指定使用哪个三角形部分,例如:

#include <Eigen/IterativeLinearSolvers>
 
ConjugateGradient<SparseMatrix<double>, Eigen::Upper> solver;
x = solver.compute(A).solve(b);

在上面的例子中,仅考虑输入矩阵A的上三角部分进行求解。相反的三角形可能为空,也可能包含任意值。

如果必须解决具有相同稀疏模式的多个问题,则“计算”步骤可以分解如下:

SolverClassName<SparseMatrix<double> > solver;
solver.analyzePattern(A);  // for this step the numerical values of A are not used
solver.factorize(A);
x1 = solver.solve(b1);
x2 = solver.solve(b2);
...
// modify the values of the nonzeros of A, the nonzeros pattern must stay unchanged
A = ...; 
solver.factorize(A);
x1 = solver.solve(b1);
x2 = solver.solve(b2);
...

compute() 方法相当于同时调用 analyzePattern()factorize()

每个求解器都提供一些特定的功能,例如行列式、对因子的访问、迭代的控制等。更多详细信息可在相应类的文档中找到。

最后,大多数迭代求解器也可以在无矩阵上下文中使用,请参阅以下示例。

计算步骤

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 来编译该例程。使用 --help 选项运行它以获取所有可用选项的列表。基本上,要测试的矩阵应该遵循 MatrixMarket 坐标格式,并且该例程返回Eigen中所有可用求解器的统计信息。

要以 MatrixMarket 格式导出矩阵和右侧向量,可以使用不受支持的 SparseExtra 模块:

#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");

下表给出了来自几个 Eigen 内置和外部求解器的 XML 统计信息的示例:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/677043.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零基础速成simulink代码生成——结合CANOE的DBC文件CAN报文代码生成 移植到硬件4

零基础速成simulink代码生成——结合CANOE的DBC文件CAN报文代码生成 移植到硬件4 本次我们将讲解如何将代码放到嵌入式硬件上运行,本次例子将dbc文件导入simulink中,生成代码,不需要我们自己实现数据库的内容。 导入DBC文件 新建一个simulink模型 MCU_CAN.slx simulink具…

开源计算机视觉库OpenCV详解

目录 1、概述 2、OpenCV详细介绍 2.1、OpenCV的起源 2.2、OpenCV开发语言 2.3、OpenCV的应用领域 3、OpenCV模块划分 4、OpenCV源码文件结构 4.1、根目录介绍 4.2、常用模块介绍 4.3、CUDA加速模块 5、OpenCV配置以及Visual Studio使用OpenCV 6、OpenCV和OpenGL的区…

SpringBoot常用操作

SpringBoot常用操作 SpringBoot启动过程 1. 生成一个SpringApplication的对象1. webApplicationType 推测web应用类型&#xff08;NONE、REACTIVE、SERVLET&#xff09;2. 从spring.factories中获取BootstrapRegistryInitializer对象3. initializers 从spring.factories中获…

A brief taste of JIFA

JIFA 是阿里贡献给 Eclipse 的一个适用于 Java 应用的问题诊断应用。 它以图形化的方式展示 Heap Dump AnalysisGC Log AnalysisThread Dump Analysis 因为云环境/生产环境的一些限制&#xff0c;应用的问题可能不能被就地分析&#xff0c;所以Jifa provides a web solution…

关于运动模糊问题的分析及处理方法

1、问题背景 前段时间有做一个化妆镜项目&#xff0c;就是一面镜子上装有一个摄像头&#xff0c;用户对着镜子化妆时&#xff0c;可同时用来采集人脸信息&#xff0c;分析人脸用的。客户反馈抓拍静止的人脸图像时&#xff0c;画面正常&#xff0c;而当人脸稍微运动时&#xff…

java springboot整合MyBatis实现分页查询以及带条件的分页查询

之前的文章 java springboot整合MyBatis做数据库查询操作操作了springboot整合MyBatis&#xff0c;然后简单做了个按id查询的操作 那么 我们按上文搭建起的环境继续 我们直接在staffDao接口中声明一个分页函数 Select("select * from staff limit #{page},#{pageSize}&q…

【Vue】Vite 组件化开发

文章目录 组件化开发一、组件化开发思想二、Vue 组件的构成2.1 组件组成结构2.2 组件 template 节点2.2.1 在 template 中使用指令2.2.2 在 template 中定义根节点 2.3 组件的 script 模板 三、组件的基本使用3.1 组件的注册3.1.1 全局组件注册3.1.2 局部组件注册 3.2 组件样式…

ffmpeg命令参数

主要参数 -i 设定输入流 -f 设定输出格式&#xff08;format&#xff09; -ss 开始时间 -t 时间长度视频参数 -vframes 设置要输出的视频帧数 -b 设定视频码率 -b:v 视频码率 -r 设定帧率 -s 设定画面的宽与高 -vn 不处理视频 -aspect aspect 设置横纵比4:3 或16:9 或1.333或…

软件项目管理 第三章软件项目的启动过程课后习题参考答案——主编:李冰、张桥珍、刘玉娥

第三章 软件项目的启动过程 课后习题参考答案 1.选择题 &#xff08;1&#xff09;乙方在项目初始阶段的主要任务不包含以下哪一项&#xff08;D&#xff09;。 A. 项目分析 B. 竞标 C. 合同签署 D. 合同管理 &#xff08;2&#xff09;项目章程中不…

Spring Boot Configuration Annotation Processor not configured 问题解决

目录 问题抛出&#xff1a; ConfigurationProperties 问题抛出&#xff1a; 进行Spring Boot配置文件部署时&#xff0c;发出警告Spring Boot Configuration Annotation Processor not configured&#xff0c;但是不影响运行。 不过有时候springboot项目出错了并且排除了所有…

【裸机开发】中断系统 —— 中断向量表(设置中断向量偏移的原因)

之前的LED驱动不存在中断&#xff0c;也就不包含中断的初始化。如果程序包含了中断&#xff0c;我们应还需要初始化哪些内容&#xff1f;要解决这个问题&#xff0c;我们需要先了解一个中断系统包含了哪些内容。 ① 中断向量表&#xff1a;描述中断对应的中断服务函数&#xf…

C++笔记之stack、queue、priority_queue、deque

code review! C笔记之stack、queue、priority_queue、deque 文章目录 C笔记之stack、queue、priority_queue、deque一.cppreference介绍1.stack2.queue3.priority_queue4.deque 二.容器适配器三.stack详解1.创建一个不包含任何元素的 stack 适配器&#xff0c;并采用默认的 de…

Debian 12中再次安装R软件

上篇博客&#xff08;地址&#xff1a;https://blog.csdn.net/my1114/article/details/131347147?spm1001.2014.3001.5501&#xff09;中所述的&#xff0c;在Debian12中按默认方式编译安装R软件&#xff0c;有一定的局限性。 如下图所示&#xff1a; 因此&#xff0c;本…

Redis入门(2)-字符串

String是Redis最基础、最常见的类型&#xff0c;string类型的value中可存放任意数据&#xff0c;包括数值型、二进制的图片、音频、视频、序列化对象等。一个String类型的value最大是512M. 1.getset k v 若key存在返回之前的值&#xff0c;若不存在返回nil 2.strlen key 返…

【面试】标准库相关题型(三)

文章目录 1. unordered_map底层实现原理1.1 散列表1.2 STL 中的 unordered_map 的实现1.3 unordered_map 2. 迭代器底层实现原理及种类2.1 主要作用2.2 底层原理2.3 迭代器类型属性 3. 迭代器失效3.1 容器类别3.2 失效情况3.3 C11容器类别 4. STL容器的线程安全4.1 背景知识4.2…

Git分支使用方法

目录 前言 一、查看可用分支 二、创建新分支 三、切换到新分支 四、在新分支上进行工作 五、提交更改 六、切换回主分支 前言 分支是指在同一个代码仓库中的不同版本线。它们可以被用来同时开展不同的开发任务、修复bug或实现新功能&#xff0c;而不会影响到主要的代码…

【数据结构】栈和队列的应用

&#x1f387;[数据结构]栈和队列的应用&#x1f387; &#x1f31f; 正式开始学习数据结构啦~此专栏作为学习过程中的记录&#x1f31f; 文章目录 &#x1f387;[数据结构]栈和队列的应用&#x1f387;&#x1f370;一.栈在括号表达式中的应用&#x1f680;1.原理&#x1f680…

Linux1.基础指令(上)

1.Linux系统可创建多个用户。 2.创建用户:adduser 用户名 设置密码:passwd 用户名 (系统会提示再次输入密码&#xff0c;注意密码不回显)。 3.删除用户首先要在root权限下&#xff0c;输入指令:userdel -r 用户名。 4.ls指令 ls -a(显示所有文件&#xff0c;包括隐藏文件) :…

【软件设计师暴击考点】计算机组成原理与体系结构高频考点暴击系列【二】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…

【P3】kali 最强渗透工具 - metasploit(安装配置及使用教程详解)

文章目录 一、metasploit 是什么&#xff1f;二、metasploit 攻击 windows 操作系统三、metasploit 攻击永恒之蓝全流程四、metasploit 攻击成功后能做什么4.1、操作步骤4.2、攻击示例 五、msfvenom 绕过杀毒软件技巧5.1、捆绑木马5.2、加壳&#xff1a;压缩壳、加密壳5.2.1、T…