Расчет инверсии разреженной матрицы с использованием Cholmod и Cholmod-Extra

Я недавно установил Cholmod для того, чтобы выполнять редкие холески в некоторых кодах C ++. Затем я хотел использовать декомпрессию для вычисления обратной матрицы (у меня следующая проблема:

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

где d это вектор ^T указывает на транспонирование, A а также B редки)

где я хотел рассчитать фактическую обратную 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 ++.

ура
Линдли

1

Решение

Я раньше пользовалась JAMA. Имеет разложение Холецкого.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]