稀疏矩阵解题数学库 -- UMFPACK

UMFPACK就是求解类似于Ax=b这样问题的一个库,来自佛罗里达州立大学。可以直接到http://www.cise.ufl.edu/research/sparse/umfpack/去下载对应的包然后编译得到Windows下的lib,包含到自己的工程就可以了。

什么是UMFPACK

UMFPACK是专门求解类似于Ax=b这样的稀疏矩阵方程的一个库,一般情况下A 是稀疏非对称的矩阵。它是基于非对称的多波前算法( Unsymmetric-pattern MultiFrontal method )对稀疏矩阵方程进行求解的。UMFPACk可以对PAQ,PRAQ,PR-1AQ 这样的矩阵进行 LU分解(L 和 U 分别是下三角矩阵和上三角矩阵,PQ是可置换矩阵,R是对角阵) 。这里有一个概念:reduce fill-in (减少注入元),稀疏矩阵的注入元是指执行算法后从初始的零值变为非零值的那些元素。

UMFPACK现在最新的版本是5.6。UMFPACK可以再matlab 中使用,也可以用到C程序中。接下来我们主要介绍如何在C程序中使用。

如何在C中使用UMFPACK

根据稀疏矩阵的非零元素个数以及是否实数,UMFPACK主要提供以下几个种类的函数供调用:

1.umfpack_di_*:  非零元素的个数为 int 型,元素为实数

2.umfpack_dl_*:  非零元素的个数为 SuiteSparse_long型,元素为实数

3.umfpack_zi_*:   非零元素的个数为 int 型,元素为复数

4.umfpack_zl_*:  非零元素的个数为 SuiteSparse_long型,元素为复数

根据不同的情况可调用不同的函数,接下来我们就来看看 上述函数中的 * 都代表什么。主要有以下5个函数,也是用来求解Ax=b 的5个步骤:

1.umfpack_*_symbolic:

该函数会返回一个指向Symbolic类型的void * 指针。主要进行符号分解。

2.umfpack_*_numeric:

该函数主要对之间所说的矩阵(PAQ,PRAQ,PR-1AQ )进行数值分解,需要用到umfpack_*_symbolic返回的结果。

最后返回一个指向Numeric类型的void * 指针。

3.umfpack_*_solve:

该函数用来求解线性系统(Ax=b,ATx=b),会用到umfpack_*_numeric返回的结果。矩阵A必须是方的。

4.umfpack_*_free_symbolic:

释放umfpack_*_symbolic得到的Symbolic对象。

5.umfpack_*_free_numeric:

释放umfpack_*_numeric得到的Numeric对象。

在程序中调用上述方法即可,最后我们会给出一个例子。

UMFPACK中稀疏矩阵的表示方法

现在我们来看一下UMFPACK中稀疏矩阵是如何表示的,UMFPACK中采用compressed column form的格式表示一个稀疏矩阵。

假设一个M*N的矩阵,有nz个非零元素,umfpack中这样表示(int 为例):

     int  Ap[n+1];

     int Ai[nz];

     double Ax[nz];

  1. Ap 是一个列数+1 的整型数组,第一个元素为0 ,即Ap[0]=0; 之后的每个元素为当前列与之前所有列的非零元素之和。
  2. Ai 对应每列中非零元素所在的位置,Ai 依赖于Ap
  3. Ax 与Ai 对应,表示每个非零元素的值。

如上所示一个稀疏矩阵,对应的Ap, Ai, Ax如下所示:

int Ap[]={0,2,5,9,10,12};

int Ai[]={0,1,0,2,4,1,2,3,4,2,1,4};

double Ax[]={2.0,3.0,3.0,-1.0,4.0,4.0,-3.0,1.0,2.0,2.0,6.0,1.0};

小例子demo

#include "umfpack.h" int n = 5 ; int Ap [ ] = {0, 2, 5, 9, 10, 12} ; int Ai [ ] = { 0, 1, 0, 2, 4, 1, 2, 3, 4, 2, 1, 4} ; double Ax [ ] = {2.0, 3.0, 3.0, -1.0, 4.0, 4.0, -3.0, 1.0, 2.0, 2.0, 6.0, 1.0} ; double b [ ] = {8.0, 45.0, -3.0, 3.0, 19.0} ; double x [5] ; int main() { double *null = (double *) NULL ; int i ; void *Symbolic, *Numeric ; (void) umfpack_di_symbolic (n, n, Ap, Ai, Ax, &Symbolic, null, null) ; (void) umfpack_di_numeric (Ap, Ai, Ax, Symbolic, &Numeric, null, null) ; umfpack_di_free_symbolic (&Symbolic) ; (void) umfpack_di_solve (UMFPACK_A, Ap, Ai, Ax, x, b, Numeric, null, null) ; umfpack_di_free_numeric (&Numeric) ;
//  从x中得到最终的解并使用即可 return (0) ; }

时间: 2024-10-13 10:14:24

稀疏矩阵解题数学库 -- UMFPACK的相关文章

XNA数学库

XNA Math Vectors 在direct3D 9 和10中,包含3D数学库的D3DX库支持向量和其他核心类型的计算.在direct11中,D3DX库不在包含3D数学库,取而代之的是XNA数学库.XNA利用的是特殊的硬件寄存器.在windows环境中,XNA数学库使用SSE2(Streaming SIMD Extension 2)指令集.它使用128-bits大小的SIMD(single instruction multiple data)寄存器,可以用一个指令操作4个32-bits浮点型

Lua 笔记--数学库

一.数学库 --获取系统时间 print(os.time()) --调用math.sin函数 print(math.sin(30)) --[[将角度转换成弧度 math.deg(x) --将弧度转换成角度 math.rad(x) ]] --[[指数函数.对数函数 math.exp(x) math.log(x) ]] --取整函数 local n = 3.14 print(math.floor(n)) --向下取整 print(math.ceil(n)) --向上取整 --取最大值.最小值 pri

DirectX11 学习笔记6 - 使用D3DXMATH数学库的一个例子

这个例子是在之前的例子基础上 ,把之前d3dx10math数学库换成了最新的d3dxmath.优点就不说了.先上效果图 全部代码.以及效果文件 文件结构 全部代码: 按照上图的文件顺序 #pragma once #include <D3DX10math.h> #include <xnamath.h> class XCamera { public: XCamera() { m_positionX = 0.0f; m_positionY = 0.0f; m_positionZ = 0.

Lua_第17 章 数学库

第17 章 数学库 在这一章中(以下关于标准库的几章中相同)我的主要目的不是对每个函数给出完整地说明,而是告诉你标准库可以提供什么功能.为了可以清楚地说明问题,我可能 会忽略一些小的选项或者行为.基本的思想是激发你的好奇心,这些好奇之处可能在參考于冊中找到答案. 数学库由算术函数的标准集合组成.比方三角函数库(sin, cos, tan, asin, acos, etc.), 幂指函数(exp, log,  log10),舍入函数(floor,  ceil).max.min.加上一个变量 pi.

最强数学库GSL(GNU Scientific Library) Qt环境下部署

1.前言 GSL(GNU Scientific Library)是一个 C 写成的用于科学计算的库,有超过1000个函数,该库提供了关于数学计算的很多方面,Matlab的大部分函数几乎都能借助它实现,可以在数值计算中省却很多事情.关于GSL的详细功能.GSL的功能及相关头文件的介绍可以见此偏文章:http://blog.csdn.net/augusdi/article/details/8834182,或者看看这位仁兄的blog:http://www.cnblogs.com/Jedimaster/

Chapter 18_0 数学库

从今天起,开始接触Lua的标准库.一路走来,从最基本的变量.函数.迭代器.协同程序到稍微复杂的元表.元方法.环境.模块,以及最后被整蒙了的对象编程.继承.类.弱引用table.垃圾回收终结器.只要坚持下去,会慢慢吃透的! 数学库这一章讲的不多,更多详细介绍参考Lua手册. math(数学)库由一组标准的数学函数构成,三角函数.指数.对数函数.取整函数.生成伪随机数的函数.以及变量pi和huge等等. 所有的三角函数都使用弧度单位,可以使用函数deg和rad来转换角度和弧度. 比如要使用角度单位:

libGdx #4 数学库(1) Vector2

Vector2,顾名思义就是二维向量. 预备知识:矢量 何为向量?最基本的来说,就是一组数.二维向量,就是两个数.两个数,可以表示一个点,也可以表示一条有向线段.为了区分,在这节课中,将数学意义上的有向线段称为"矢量",而将此处用来储存和计算数据的Vector2称为"向量" 将一个矢量的起点平移到原点,其终点的坐标(如例中A(61.27, 50.69))就代表了这一个矢量.同样,一个点可以表示为一段从原点指向这个点的矢量. 两个矢量的加法,直接将其平移至首尾相接,从

&lt;泛&gt; C++3D数学库设计详解 简单光学几何 &amp;&amp; 随机向量生成

// 注:本内容为作者原创,禁止在其他网站复述内容以及用于商业盈利,如需引用,请标明出处:http://www.cnblogs.com/lv_anchoret/  Preface 当初写这个库,是为了支持光线追踪的学习,所以,学完第一本书,这时候,我们整合一些物理光学方面的运算,封装到我们的泛型库里面 新库增加的目录: --lvgm ----opticsfunc.hpp ----randfunc.cpp  Ready 需要大家拥有之前的向量库做支持 我们这一篇涉及到的库文件比较少 我们这一篇涉及

对MSVS下编译ARPACK数学库的一点补充说明

这周项目需要编译ARPACK库,感谢该博主的博文中的具体指导:“Visual studio 2015 +Windows10 配置ARPACK,用ARPACK求解特征值特征向量”,https://blog.csdn.net/barcelona941017/article/details/79727784. 由于是在公司内网下编译及其它情况,产生了一些方法上的差异,现注明之. 公司内网计算机开发环境是:Windows 7 + MSVS 2013 Update 5. 1. 下载: 原博文需要下载Min