簡體   English   中英

使用Cholmod和Cholmod-Extra計算稀疏矩陣的逆

[英]Calculating the inverse of a sparse matrix using Cholmod and Cholmod-Extra

我最近安裝了Cholmod ,以便在某些C ++代碼中執行稀疏的cholesky分解。 然后,我想使用decomp來計算矩陣逆(我有以下問題:

d^T . (A^-1 + B^-1)^-1 . d

其中d是向量^T表示轉置, AB稀疏)

在這里我想計算B的實際逆,然后可以線性求解涉及和的解。 調用它的代碼如下:

cholmod_common Common, *cm ;
cm = &Common ;
cholmod_start (cm) ;
cm->print=5;
Common.supernodal = CHOLMOD_SUPERNODAL ;
double *Tx, x;
int *Ti, *Tj, *Rdeg, *Cdeg,j;
cholmod_triplet *T ;
size_t nrow;           
size_t ncol;           
size_t nnz ;            

nrow=Csize;
ncol=Csize;
nnz=numpulsars*numpulsars*numcoeff;

T = cholmod_allocate_triplet(nrow,ncol,nnz,0,CHOLMOD_REAL, cm) ;
Ti=(int*)T->i;
Tj=(int*)T->j;
Tx=(double*)T->x;

for(int i=0;i<numpulsars;i++){      
            for(int j=0;j<numpulsars;j++){
                    if(i==j){
                            pcorr=1.0;
        }
                    else{   
                            angle=pulsarCartesian[i][0]*pulsarCartesian[j][0] +pulsarCartesian[i][1]*pulsarCartesian[j][1]+pulsarCartesian[i][2]*pulsarCartesian[j][2];
                            pcorr=(1.5*(0.5*(1-angle))*log(0.5*(1-angle)) - 0.25*0.5*(1-angle) + 0.5);
                    }

                    for(int c1=0; c1<numcoeff; c1++){
                                    val= pcorr*powercoeff[c1];
                Ti[T->nnz]=i*numcoeff+c1;
                Tj[T->nnz]=j*numcoeff+c1;
                Tx[T->nnz]=val;
                (T->nnz)++;


                    }
           }
    }


cholmod_sparse *PPFMSparse;
cholmod_factor *L ;
cholmod_dense *spinvK;
PPFMSparse=cholmod_triplet_to_sparse(T,T->nnz,cm);
//  cholmod_print_sparse(PPFMSparse, "PPFMSparse", cm); 
L = cholmod_analyze (PPFMSparse, cm) ;
cholmod_factorize (PPFMSparse, L, cm) ;

cholmod_sparse *PPFMinv; 

PPFMinv=cholmod_spinv(L,cm);
//  cholmod_print_sparse(PPFMinv, "PPFMinv", cm);
spinvK = cholmod_sparse_to_dense(PPFMinv, &Common) ;
cholmod_print_dense(spinvK, "spinvK", cm);
cholmod_free_sparse(&PPFMinv,cm);
cholmod_free_factor (&L, cm) ;
cholmod_free_sparse(&PPFMSparse,cm);
cholmod_free_triplet (&T, cm) ;
cholmod_free_dense (&spinvK, cm) ;
cholmod_finish(cm);

我發現https://cholmod-extra.readthedocs.org/en/latest/functions.html此函數用於計算反函數,但它給了我一些與反函數平方有關的信息,而不是與反函數平方有關的信息。 我只是想知道是否有人使用過此方法,或者用等效的方法來計算C ++中稀疏矩陣的逆。

干杯林德利

我以前使用過JAMA 它具有Cholesky分解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM