Beispiel #1
0
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;
}
Beispiel #2
0
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) ;
}