int Hermes::Algebra::SparseMatrix<Scalar>::sort_and_store_indices(Page *page, int *buffer, int *max) { // gather all pages in the buffer, deleting them along the way int *end = buffer; while (page != NULL) { memcpy(end, page->idx, sizeof(int) * page->count); end += page->count; Page *tmp = page; page = page->next; delete tmp; } // sort the indices and remove duplicities qsort_int(buffer, end - buffer); int *q = buffer; for (int *p = buffer, last = -1; p < end; p++) if(*p != last) *q++= last = *p; return q - buffer; }
MRI_IMAGE * mri_bport_indexed( int nind , int *ind , int ntime , int nbefore , int nafter ) { MRI_IMAGE *fim ; float *far , *fii , *fip , freq ; int ff , ii,jj,kk , nev=(ntime%2==0) , ncol,nrow , nth=ntime/2 ; int nqind , *qind ; ENTRY("mri_bport_indexed") ; if( nind <= 0 || ind == NULL || ntime < 9 ) RETURN(NULL) ; if( nbefore < 0 ) nbefore = 0 ; if( nafter < 0 ) nafter = 0 ; /*--- edit a local copy of the list of indexes ---*/ qind = (int *)malloc(sizeof(int)*nind) ; /* cast out illegal values */ for( nqind=ii=0 ; ii < nind ; ii++ ){ if( ind[ii] >= BP_ffbot && ind[ii] <= nth ) qind[nqind++] = ind[ii] ; } if( nqind == 0 ){ free(qind) ; RETURN(NULL) ; } /* cast out duplicate values */ qsort_int( nqind , qind ) ; for( jj=ii=1 ; ii < nqind ; ii++ ){ if( qind[ii] == qind[ii-1] ) continue ; if( jj < ii ) qind[jj] = qind[ii] ; jj++ ; } nqind = jj ; if( BP_invert ){ intvec *ivv = invert_integer_list( nqind,qind , BP_ffbot,nth ) ; if( ivv == NULL ){ free(qind) ; RETURN(NULL) ; } nqind = ivv->nar ; qind = realloc(qind,sizeof(int)*nqind) ; for( ii=0 ; ii < nqind ; ii++ ) qind[ii] = ivv->ar[ii] ; KILL_intvec(ivv) ; } #if 1 fprintf(stderr," + Frequency indexes: blocklen=%d ::",ntime) ; for( ii=0 ; ii < nqind ; ii++ ) fprintf(stderr," %d",qind[ii]) ; fprintf(stderr,"\n") ; #endif /* count columns to generate */ for( ncol=ii=0 ; ii < nqind ; ii++ ){ if( qind[ii] == 0 || (qind[ii] == nth && nev) ) ncol += 1 ; else ncol += 2 ; } if( ncol == 0 ){ free(qind) ; RETURN(NULL) ; } if( BP_quad ) ncol += 2 ; nrow = ntime + nbefore + nafter ; fim = mri_new( nrow , ncol , MRI_float ) ; far = MRI_FLOAT_PTR(fim) ; for( jj=ii=0 ; jj < nqind ; jj++ ){ ff = qind[jj] ; fii = far + (ii*nrow + nbefore) ; if( ff == 0 ){ for( kk=0 ; kk < ntime ; kk++ ) fii[kk] = 1.0f ; ii++ ; /* added 1 col */ } else if( ff == nth && nev ){ for( kk=0 ; kk < ntime ; kk++ ) fii[kk] = 2*(kk%2)-1 ; ii++ ; /* added 1 col */ } else { fip = fii + nrow ; freq = ff * (2.0f*3.141593f) / (float)ntime ; for( kk=0 ; kk < ntime ; kk++ ){ fii[kk] = cosf(freq*kk) ; fip[kk] = sinf(freq*kk) ; } ii += 2 ; /* added 2 cols */ } } if( BP_quad ){ float xmid=0.5*(ntime-1) , xfac=1.0f/xmid ; fii = far + (ii*nrow + nbefore) ; for( kk=0 ; kk < ntime ; kk++ ) fii[kk] = (float)Plegendre(xfac*(kk-xmid),1) ; ii++ ; fii = far + (ii*nrow + nbefore) ; for( kk=0 ; kk < ntime ; kk++ ) fii[kk] = (float)Plegendre(xfac*(kk-xmid),2) ; } free(qind) ; RETURN(fim) ; }