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.