UMFPACK的使用
2008-3-25 Jingwenlai
UMFPACK是求解线性方程组AX=B的函数库。其使用也比较简单。以下先给个原UserGuide中简单的例子:
#include <iostream>
#include "umfpack.h"
using namespace std;
#pragma comment(lib,"libamd.lib")
#pragma comment(lib,"libatlas.lib")
#pragma comment(lib,"libf77blas.lib")
#pragma comment(lib,"libg 2c .lib")
#pragma comment(lib,"libgcc.lib")
#pragma comment(lib,"libumfpack.lib")
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.,3.,-1.,4.,4.,-3.,1.,2.,2.,6.,1.};
double b[] = {8.,45.,-3.,3.,19.};
double x[5];
int main()
{
double * null = (double*)NULL;
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_numeric(&Symbolic);
umfpack_di_solve(UMFPACK_A,Ap,Ai,Ax,x,b,Numeric,null,null);
umfpack_di_free_numeric(&Numeric);
for(int i = 0; i < n; i++)
cout<<"x["<<i<<"]="<<x[i]<<endl;
return 0;
}
UMFPACK和Taucs一样,为节省存储空间,都采用Compressed Column Storage来存储。这种存储只需要2nnz+n+1的存储空间,而传统的二维方式存储则需要n*n的存储空间。有关Compressed Column Storage的描述请先参见以下的Compressed Row Storage及CCS的介绍:
CCS实际上可以看成A^T的CRS:
相对于TAUCS来说,UMFPACK可能较少人使用,但是,TAUCS在我看来,对求解AX=B时输入A不方便,而UMFPACK除提供了如上面的例子那样的CCS格式外,还提供了另外一种称为triplet的格式作为输入,然后可以通过umfpack_triplet_to_col来将triplet格式转换成CCS格式,继而使用UMFPACK中的函数进行求解。Triplet格式可以看成(i ,j ,Aij).若一个稀疏阵有nnz个非零元素,则Ti[nnz],Tj[nnz],Tx[nnz]可以保存所有的非零元素。例,若Ti[k] = I,Tj[k] = j, Tx[k] = a,则表示A的i行j列为元素a。
在输入完矩阵的元素并进行转换之后,用UMFPACK求解的步骤只包括三步,即SymbolicFactorization,NumericalFactorization,Solve.
本文只是对UMFPACK的简单介绍,详细的使用请参见UserGuide.