1 #include "mrilib.h"
2 
mri_xsort_inplace(MRI_IMAGE * im,int rev)3 void mri_xsort_inplace( MRI_IMAGE *im , int rev )
4 {
5    float *far , *car ;
6    int nx , nc , ii,jj ;
7 
8    if( im == NULL ) return ;
9 
10    nx  = im->nx ; if( nx < 2 ) return ;
11    nc  = im->nvox / nx ;
12 
13    switch( im->kind ){
14 
15      default: break ;
16 
17      case MRI_float:{
18        float *far = MRI_FLOAT_PTR(im) , *car ;
19        for( jj=0 ; jj < nc ; jj++ ){
20          car = far+jj*nx ;
21          if( rev ) for( ii=0 ; ii < nx ; ii++ ) car[ii] = -car[ii] ;
22          qsort_float( nx , car ) ;
23          if( rev ) for( ii=0 ; ii < nx ; ii++ ) car[ii] = -car[ii] ;
24        }
25      }
26      break ;
27 
28      case MRI_short:{
29        short *sar = MRI_SHORT_PTR(im) , *car ;
30        for( jj=0 ; jj < nc ; jj++ ){
31          car = sar+jj*nx ;
32          if( rev ) for( ii=0 ; ii < nx ; ii++ ) car[ii] = -car[ii] ;
33          qsort_short( nx , car ) ;
34          if( rev ) for( ii=0 ; ii < nx ; ii++ ) car[ii] = -car[ii] ;
35        }
36      }
37      break ;
38    }
39 
40    return ;
41 }
42 
43 /*-------------------------------------------------------------------------*/
44 /* Sort on column #jc -- only works for float data at this time. */
45 
mri_csort_inplace(MRI_IMAGE * im,int rev,int jc)46 void mri_csort_inplace( MRI_IMAGE *im , int rev , int jc )
47 {
48    float *far , *car , *qar ;
49    int nx , nc , ii,jj,kk , *iar ;
50    MRI_IMAGE *qim ;
51 
52    if( im == NULL || im->kind != MRI_float ) return ;
53 
54    nx  = im->nx ; if( nx < 2 ) return ;
55    nc  = im->nvox / nx ;
56 
57    if( nc == 1 ){ mri_xsort_inplace(im,rev); return; }
58 
59    car = (float *)malloc(nx*sizeof(float)) ;
60    iar = (int   *)malloc(nx*sizeof(int  )) ;
61    far = MRI_FLOAT_PTR(im) ;
62 
63    if( jc < 0 ) jc = 0 ; else if( jc >= nc ) jc = nc-1 ;
64 
65    for( ii=0 ; ii < nx ; ii++ ){
66      iar[ii] = ii ;
67      car[ii] = far[ii+jc*nx] ; if( rev ) car[ii] = -car[ii] ;
68    }
69 
70    qsort_floatint(nx,car,iar) ; free(car) ;
71 
72    qim = mri_new_conforming(im,MRI_float) ;
73    qar = MRI_FLOAT_PTR(qim) ;
74 
75    for( ii=0 ; ii < nx ; ii++ ){
76      kk = iar[ii] ;
77      for( jj=0 ; jj < nc ; jj++ ) qar[ii+jj*nx] = far[kk+jj*nx] ;
78    }
79 
80    free(iar) ;
81 
82    memcpy(far,qar,sizeof(float)*nx*nc) ; mri_free(qim) ;
83    return ;
84 }
85