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