Doxygen Source Code Documentation
cs.h File Reference
#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <math.h>#include "mcw_malloc.h"Go to the source code of this file.
Functions | |
| void | qsort_floatint (int, float *, int *) |
| void | qsort_doubleint (int, double *, int *) |
| void | qsort_intint (int, int *, int *) |
| void | qsort_floatfloat (int, float *, float *) |
| void | qsort_floatstuff (int, float *, void **) |
| float | qmed_float (int, float *) |
| void | qmedmad_float (int, float *, float *, float *) |
| void | symeig_double (int, double *, double *) |
| void | symeigval_double (int, double *, double *) |
| void | svd_double (int, int, double *, double *, double *, double *) |
| void | svd_float (int, int, float *, float *, float *, float *) |
| void | addto_args (int, char **, int *, char ***) |
| void | append_string_to_args (char *, int, char **, int *, char ***) |
| void | prepend_string_to_args (char *, int, char **, int *, char ***) |
| void | get_laguerre_table (int, double **, double **) |
| int | qhull_wrap (int, float *, int **) |
| int | sphere_voronoi_angles (int, float *, float *, float **) |
| int | sphere_voronoi_vectors (int, float *, float **) |
| float | cl1_solve (int, int, float *, float **, float *, int) |
| float | cl1_solve_res (int, int, float *, float **, float *, int, float *, int) |
| char * | approximate_number_string (double) |
Function Documentation
|
||||||||||||||||||||
|
|
|
||||||||||||||||||||||||
|
|
|
|
Definition at line 3 of file cs_misc.c.
00004 {
00005 static char sval[128] ;
00006 double aval=fabs(val) , tval ;
00007 int lv , qv ;
00008
00009 if( aval == 0.0 ){ strcpy(sval,"Zero"); return; }
00010
00011 if( val < 0.0 ){ strcpy(sval,"-"); } else { sval[0] = '\0'; }
00012
00013 lv = (int) floor(log10(aval)/3.0) ;
00014 tval = pow(10.0,(double)(3*lv)) ;
00015 qv = (int) rint(aval/tval) ;
00016 sprintf( sval+strlen(sval) , "%d" , qv ) ;
00017
00018 switch( lv ){
00019
00020 case 0: break ;
00021
00022 case 1: strcat(sval+strlen(sval)," thousand") ; break ;
00023 case 2: strcat(sval+strlen(sval)," million" ) ; break ;
00024 case 3: strcat(sval+strlen(sval)," billion" ) ; break ;
00025 case 4: strcat(sval+strlen(sval)," trillion") ; break ;
00026 case 5: strcat(sval+strlen(sval)," quadrillion") ; break ;
00027 case 6: strcat(sval+strlen(sval)," quintillion") ; break ;
00028
00029 case -1: strcat(sval+strlen(sval)," thousand-ths") ; break ;
00030 case -2: strcat(sval+strlen(sval)," million-ths") ; break ;
00031 case -3: strcat(sval+strlen(sval)," billion-ths") ; break ;
00032 case -4: strcat(sval+strlen(sval)," trillion-ths") ; break ;
00033
00034 default:
00035 strcat(sval+strlen(sval)," jillion") ;
00036 if( lv < 0 ) strcat(sval+strlen(sval),"-ths") ;
00037 break ;
00038 }
00039
00040 return (char *)sval ;
00041 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 37 of file cl1.c. References calloc, cl1_fort(), free, l, and q. Referenced by L1F_worker(), and main().
00038 {
00039 /* loop counters */
00040
00041 int jj , ii ;
00042
00043 /* variables for CL1 (types declared in f2c.h) */
00044
00045 integer k,l,m,n,klmd,klm2d,nklmd,n2d , kode=0,iter , *iu,*s ;
00046 real *q , toler , *x , *res , error , *cu ;
00047
00048 /*-- check inputs --*/
00049
00050 if( ndim < 1 || nvec < 1 ) kode = 4 ;
00051 if( A == NULL || y == NULL || z == NULL ) kode = 4 ;
00052 for( jj=0 ; jj < nvec ; jj++ ) if( A[jj] == NULL ) kode = 4 ;
00053
00054 if( kode ){
00055 fprintf(stderr,"** cl1_solve ERROR: illegal inputs!\n") ;
00056 return (float)(-kode) ;
00057 }
00058
00059 /*-- setup call to CL1 --*/
00060
00061 k = ndim ;
00062 l = 0 ; /* no linear equality constraints */
00063 m = 0 ; /* no linear inequality constraints */
00064 n = nvec ;
00065
00066 klmd = k+l+m ;
00067 klm2d = k+l+m+2 ;
00068 nklmd = n+k+l+m ;
00069 n2d = n+2 ;
00070
00071 kode = (cony != 0) ; /* enforce implicit constraints on x[] */
00072 iter = 11*klmd ;
00073
00074 toler = 0.0001 ;
00075 error = 0.0 ;
00076
00077 /* input/output matrices & vectors */
00078
00079 q = (real *) calloc( 1, sizeof(real) * klm2d*n2d ) ;
00080 x = (real *) calloc( 1, sizeof(real) * n2d ) ;
00081 res = (real *) calloc( 1, sizeof(real) * klmd ) ;
00082
00083 /* workspaces */
00084
00085 cu = (real *) calloc( 1, sizeof(real) * 2*nklmd ) ;
00086 iu = (integer *) calloc( 1, sizeof(integer) * 2*nklmd ) ;
00087 s = (integer *) calloc( 1, sizeof(integer) * klmd ) ;
00088
00089 /* load matrices & vectors */
00090
00091 for( jj=0 ; jj < nvec ; jj++ )
00092 for( ii=0 ; ii < ndim ; ii++ )
00093 q[ii+jj*klm2d] = A[jj][ii] ; /* matrix */
00094
00095 for( ii=0 ; ii < ndim ; ii++ )
00096 q[ii+nvec*klm2d] = z[ii] ; /* vector */
00097
00098 if( cony ){
00099 for( jj=0 ; jj < nvec ; jj++ ) /* constraints on solution */
00100 x[jj] = (y[jj] < 0.0) ? -1.0
00101 :(y[jj] > 0.0) ? 1.0 : 0.0 ;
00102 }
00103
00104 for( ii=0 ; ii < klmd ; ii++ ) /* no constraints on resids */
00105 res[ii] = 0.0 ;
00106
00107 /*-- do the work --*/
00108
00109 cl1_fort( &k, &l, &m, &n,
00110 &klmd, &klm2d, &nklmd, &n2d,
00111 q, &kode, &toler, &iter, x, res, &error, cu, iu, s) ;
00112
00113 free(q) ; free(res) ; free(cu) ; free(iu) ; free(s) ;
00114
00115 if( kode != 0 ){
00116 free(x) ;
00117 #if 0
00118 switch( kode ){
00119 case 1: fprintf(stderr,"** cl1_solve ERROR: no feasible solution!\n"); break;
00120 case 2: fprintf(stderr,"** cl1_solve ERROR: rounding errors!\n") ; break;
00121 case 3: fprintf(stderr,"** cl1_solve ERROR: max iterations!\n") ; break;
00122 default: fprintf(stderr,"** cl1_solve ERROR: unknown problem!\n") ; break;
00123 }
00124 #endif
00125 return (float)(-kode) ;
00126 }
00127
00128 /*-- copy results into output --*/
00129
00130 for( jj=0 ; jj < nvec ; jj++ ) y[jj] = (float) x[jj] ;
00131
00132 free(x) ; return (float)error ;
00133 }
|
|
||||||||||||||||||||||||||||||||||||
|
Definition at line 170 of file cl1.c. References calloc, cl1_fort(), free, l, and q. Referenced by main().
00172 {
00173 /* loop counters */
00174
00175 int jj , ii ;
00176
00177 /* variables for CL1 (types declared in f2c.h) */
00178
00179 integer k,l,m,n,klmd,klm2d,nklmd,n2d , kode=0,iter , *iu,*s ;
00180 real *q , toler , *x , *res , error , *cu ;
00181
00182 /*-- check inputs --*/
00183
00184 if( ndim < 1 || nvec < 1 ) kode = 4 ;
00185 if( A == NULL || y == NULL || z == NULL ) kode = 4 ;
00186 for( jj=0 ; jj < nvec ; jj++ ) if( A[jj] == NULL ) kode = 4 ;
00187
00188 if( kode ){
00189 fprintf(stderr,"** cl1_solve ERROR: illegal inputs!\n") ;
00190 return (float)(-kode) ;
00191 }
00192
00193 /*-- setup call to CL1 --*/
00194
00195 k = ndim ;
00196 l = 0 ; /* no linear equality constraints */
00197 m = 0 ; /* no linear inequality constraints */
00198 n = nvec ;
00199
00200 klmd = k+l+m ;
00201 klm2d = k+l+m+2 ;
00202 nklmd = n+k+l+m ;
00203 n2d = n+2 ;
00204
00205 kode = (cony != 0 || conr != 0) ; /* enforce implicit constraints on x[] */
00206 iter = 11*klmd ;
00207
00208 toler = 0.0001 ;
00209 error = 0.0 ;
00210
00211 /* input/output matrices & vectors */
00212
00213 q = (real *) calloc( 1, sizeof(real) * klm2d*n2d ) ;
00214 x = (real *) calloc( 1, sizeof(real) * n2d ) ;
00215 res = (real *) calloc( 1, sizeof(real) * klmd ) ;
00216
00217 /* workspaces */
00218
00219 cu = (real *) calloc( 1, sizeof(real) * 2*nklmd ) ;
00220 iu = (integer *) calloc( 1, sizeof(integer) * 2*nklmd ) ;
00221 s = (integer *) calloc( 1, sizeof(integer) * klmd ) ;
00222
00223 /* load matrices & vectors */
00224
00225 for( jj=0 ; jj < nvec ; jj++ )
00226 for( ii=0 ; ii < ndim ; ii++ )
00227 q[ii+jj*klm2d] = A[jj][ii] ; /* matrix */
00228
00229 for( ii=0 ; ii < ndim ; ii++ )
00230 q[ii+nvec*klm2d] = z[ii] ; /* vector */
00231
00232 if( cony ){
00233 for( jj=0 ; jj < nvec ; jj++ ) /* constraints on solution */
00234 x[jj] = (y[jj] < 0.0) ? -1.0
00235 :(y[jj] > 0.0) ? 1.0 : 0.0 ;
00236 }
00237
00238 if( conr ){
00239 for( ii=0 ; ii < ndim ; ii++ ) /* constraints on resids */
00240 res[ii] = (rez[ii] < 0.0) ? -1.0
00241 :(rez[ii] > 0.0) ? 1.0 : 0.0 ;
00242 }
00243
00244 /*-- do the work --*/
00245
00246 cl1_fort( &k, &l, &m, &n,
00247 &klmd, &klm2d, &nklmd, &n2d,
00248 q, &kode, &toler, &iter, x, res, &error, cu, iu, s) ;
00249
00250 free(q) ; free(cu) ; free(iu) ; free(s) ;
00251
00252 if( kode != 0 ){
00253 free(x) ; free(res) ;
00254 #if 0
00255 switch( kode ){
00256 case 1: fprintf(stderr,"** cl1_solve ERROR: no feasible solution!\n"); break;
00257 case 2: fprintf(stderr,"** cl1_solve ERROR: rounding errors!\n") ; break;
00258 case 3: fprintf(stderr,"** cl1_solve ERROR: max iterations!\n") ; break;
00259 default: fprintf(stderr,"** cl1_solve ERROR: unknown problem!\n") ; break;
00260 }
00261 #endif
00262 return (float)(-kode) ;
00263 }
00264
00265 /*-- copy results into output --*/
00266
00267 for( jj=0 ; jj < nvec ; jj++ ) y[jj] = (float) x[jj] ;
00268
00269 for( ii=0 ; ii < ndim ; ii++ ) rez[ii] = (float) res[ii] ;
00270
00271 free(res); free(x); return (float)error;
00272 }
|
|
||||||||||||||||
|
Definition at line 301 of file cs_laguerre.c. Referenced by bi7func().
|
|
||||||||||||||||||||||||
|
|
|
||||||||||||||||
|
Definition at line 31 of file cs_qhull.c. References close(), fd, fdopen(), free, malloc, pclose, and popen. Referenced by sphere_voronoi_vectors().
00032 {
00033 int ii,jj , nfac , *fac ;
00034 int fd ; FILE *fp ;
00035 char qbuf[128] ;
00036
00037 #ifndef DONT_USE_MKSTEMP
00038 char fname[] = "/tmp/afniXXXXXX" ;
00039 #else
00040 char *fname ;
00041 #endif
00042
00043 if( npt < 3 || xyz == NULL || ijk == NULL ){
00044 fprintf(stderr,"qhull_wrap: bad inputs\n") ;
00045 return 0 ;
00046 }
00047
00048 #ifndef DONT_USE_MKSTEMP
00049 fd = mkstemp( fname ) ;
00050 if( fd == -1 ){ fprintf(stderr,"qhull_wrap: mkstemp fails\n"); return 0; }
00051 fp = fdopen( fd , "w" ) ;
00052 if( fp == NULL ){ fprintf(stderr,"qhull_wrap: fdopen fails\n"); close(fd); return 0; }
00053 #else
00054 fname = tmpnam(NULL) ;
00055 if( fname == NULL ){ fprintf(stderr,"qhull_wrap: tmpnam fails\n"); return 0; }
00056 fp = fopen( fname , "w" ) ;
00057 if( fp == NULL ){ fprintf(stderr,"qhull_wrap: fopen fails\n"); return 0; }
00058 #endif
00059
00060 fprintf(fp,"3\n%d\n",npt) ;
00061 for( ii=0 ; ii < npt ; ii++ )
00062 fprintf(fp,"%g %g %g\n",xyz[3*ii],xyz[3*ii+1],xyz[3*ii+2]) ;
00063
00064 fclose(fp) ;
00065
00066 sprintf(qbuf,"qhull -i -Pp < %s",fname) ;
00067 fp = popen( qbuf , "r" ) ;
00068 if( fp == NULL ){ fprintf(stderr,"qhull_wrap: popen fails\n"); remove(fname); return 0; }
00069
00070 jj = fscanf(fp,"%d",&nfac) ;
00071 if( jj != 1 || nfac < 1 ){ fprintf(stderr,"qhull_wrap: 1st fscanf fails\n"); pclose(fp); remove(fname); return 0; }
00072
00073 fac = (int *) malloc( sizeof(int)*3*nfac ) ;
00074 if( fac == NULL ){ fprintf(stderr,"qhull_wrap: malloc fails\n"); pclose(fp); remove(fname); return 0; }
00075
00076 for( ii=0 ; ii < nfac ; ii++ ){
00077 jj = fscanf(fp,"%d %d %d",fac+(3*ii),fac+(3*ii+1),fac+(3*ii+2)) ;
00078 if( jj < 3 ){
00079 fprintf(stderr,"qhull_wrap: fscanf fails at ii=%d\n",ii) ;
00080 pclose(fp); remove(fname); free(fac); return 0;
00081 }
00082 }
00083
00084 pclose(fp); remove(fname);
00085
00086 *ijk = fac ; return nfac ;
00087 }
|
|
||||||||||||
|
Definition at line 32 of file cs_qmed.c. References a, i, left, MED3, right, and SWAP. Referenced by extreme_proj(), find_unusual_correlations(), main(), median21_box_func(), median9_box_func(), mri_medianfilter(), qmedmad_float(), STATS_tsfunc(), THD_median_brick(), THD_outlier_count(), and unusuality().
00033 {
00034 register int i , j ; /* scanning indices */
00035 register float temp , pivot ; /* holding places */
00036 register float * a = ar ;
00037
00038 int left , right , mid , nodd ;
00039
00040 switch( n ){
00041 case 1: return ar[0] ;
00042 case 2: return 0.5*(ar[0]+ar[1]) ;
00043 case 3: return MED3( ar[0] , ar[1] , ar[2] ) ;
00044 case 4: return median_float4( ar[0],ar[1],ar[2],ar[3] ) ;
00045 case 5: return median_float5( ar ) ;
00046 case 7: return median_float7( ar ) ;
00047 case 9: return median_float9( ar ) ;
00048 }
00049
00050 left = 0 ; right = n-1 ; mid = n/2 ; nodd = ((n & 1) != 0) ;
00051
00052 /* loop while the subarray is at least 3 long */
00053
00054 while( right-left > 1 ){ /* work on subarray from left -> right */
00055
00056 i = ( left + right ) / 2 ; /* middle of subarray */
00057
00058 /* sort the left, middle, and right a[]'s */
00059
00060 if( a[left] > a[i] ) SWAP( a[left] , a[i] ) ;
00061 if( a[left] > a[right] ) SWAP( a[left] , a[right] ) ;
00062 if( a[i] > a[right] ) SWAP( a[right] , a[i] ) ;
00063
00064 pivot = a[i] ; /* a[i] is the median-of-3 pivot! */
00065 a[i] = a[right] ;
00066
00067 i = left ; /* initialize scanning */
00068 j = right ;
00069
00070 /*----- partition: move elements bigger than pivot up and elements
00071 smaller than pivot down, scanning in from ends -----*/
00072
00073 do{
00074 for( ; a[++i] < pivot ; ) ; /* scan i up, until a[i] >= pivot */
00075 for( ; a[--j] > pivot ; ) ; /* scan j down, until a[j] <= pivot */
00076
00077 if( j <= i ) break ; /* if j meets i, quit */
00078
00079 SWAP( a[i] , a[j] ) ;
00080 } while( 1 ) ;
00081
00082 /*----- at this point, the array is partitioned -----*/
00083
00084 a[right] = a[i] ; /* restore the pivot */
00085 a[i] = pivot ;
00086
00087 if( i == mid ){ /* good luck */
00088 if( nodd ) return pivot ; /* exact middle of array */
00089
00090 temp = a[left] ; /* must find next largest element below */
00091 for( j=left+1 ; j < i ; j++ )
00092 if( a[j] > temp ) temp = a[j] ;
00093
00094 return 0.5*(pivot+temp) ; /* return average */
00095 }
00096
00097 if( i < mid ) left = i ; /* throw away bottom partition */
00098 else right = i ; /* throw away top partition */
00099
00100 } /* end of while sub-array is long */
00101
00102 return (nodd) ? a[mid] : 0.5*(a[mid]+a[mid-1]) ;
00103 }
|
|
||||||||||||||||||||
|
Definition at line 109 of file cs_qmed.c. References free, malloc, q, and qmed_float(). Referenced by main(), plot_graphs(), and THD_outlier_count().
00110 {
00111 float * q = (float *) malloc(sizeof(float)*n) ;
00112 float me,ma ;
00113 register int ii ;
00114
00115 memcpy(q,ar,sizeof(float)*n) ; /* duplicate input array */
00116 me = qmed_float( n , q ) ; /* compute median */
00117
00118 for( ii=0 ; ii < n ; ii++ ) /* subtract off median */
00119 q[ii] = fabs(q[ii]-me) ; /* (absolute deviation) */
00120
00121 ma = qmed_float( n , q ) ; /* MAD = median absolute deviation */
00122
00123 free(q) ; /* 05 Nov 2001 */
00124
00125 *med = me ; *mad = ma ; return ;
00126 }
|
|
||||||||||||||||
|
Definition at line 133 of file cs_sort_di.c. References a, isort_doubleint(), QS_CUTOFF, and qsrec_doubleint().
00134 {
00135 qsrec_doubleint( n , a , ia , QS_CUTOFF ) ;
00136 isort_doubleint( n , a , ia ) ;
00137 return ;
00138 }
|
|
||||||||||||||||
|
Definition at line 134 of file cs_sort_ff.c. References a, isort_floatfloat(), QS_CUTOFF, and qsrec_floatfloat(). Referenced by BFIT_bootstrap_sample(), and BFIT_prepare_dataset().
00135 {
00136 qsrec_floatfloat( n , a , ia , QS_CUTOFF ) ;
00137 isort_floatfloat( n , a , ia ) ;
00138 return ;
00139 }
|
|
||||||||||||||||
|
Definition at line 133 of file cs_sort_fi.c. References a, isort_floatint(), QS_CUTOFF, and qsrec_floatint(). Referenced by find_unusual_correlations(), rank_order_float(), and RT_finish_dataset().
00134 {
00135 qsrec_floatint( n , a , ia , QS_CUTOFF ) ;
00136 isort_floatint( n , a , ia ) ;
00137 return ;
00138 }
|
|
||||||||||||||||
|
Definition at line 136 of file cs_sort_fv.c. References a, isort_floatstuff(), QS_CUTOFF, and qsrec_floatstuff(). Referenced by evolve_bitvector_array(), and MCW_sort_cluster().
00137 {
00138 qsrec_floatstuff( n , a , ia , QS_CUTOFF ) ;
00139 isort_floatstuff( n , a , ia ) ;
00140 return ;
00141 }
|
|
||||||||||||||||
|
Definition at line 133 of file cs_sort_ii.c.
00134 {
00135 qsrec_intint( n , a , ia , QS_CUTOFF ) ;
00136 isort_intint( n , a , ia ) ;
00137 return ;
00138 }
|
|
||||||||||||||||||||
|
Definition at line 101 of file cs_qhull.c. References free, malloc, and sphere_voronoi_vectors().
00102 {
00103 float *xyz ;
00104 double cp,sp,ca,sa ;
00105 int ii ;
00106
00107 if( npt < 3 || pol == NULL || azi == NULL || wt == NULL ){
00108 fprintf(stderr,"sphere_voronoi_angles: bad inputs\n"); return 0;
00109 }
00110
00111 /* make 3-vectors of the points on the sphere */
00112
00113 xyz = (float *) malloc( sizeof(float) * (3*npt) ) ;
00114
00115 for( ii=0 ; ii < npt ; ii++ ){
00116 cp = cos(pol[ii]) ; sp = sin(pol[ii]) ;
00117 ca = cos(azi[ii]) ; sa = sin(azi[ii]) ;
00118 xyz[3*ii] = sp * ca ;
00119 xyz[3*ii+1] = sp * sa ;
00120 xyz[3*ii+2] = cp ;
00121 }
00122
00123 ii = sphere_voronoi_vectors( npt , xyz , wt ) ;
00124 free(xyz) ; return ii ;
00125 }
|
|
||||||||||||||||
|
Definition at line 134 of file cs_qhull.c. References free, malloc, and qhull_wrap(). Referenced by sphere_voronoi_angles().
00135 {
00136 int ntri , *tri , ii,jj , pp,qq,rr ;
00137 float *ww ;
00138 double cp,sp,ca,sa ;
00139 double xpq,ypq,zpq , xpr,ypr,zpr , xqr,yqr,zqr , xcc,ycc,zcc ;
00140 double xpp,ypp,zpp , xqq,yqq,zqq , xrr,yrr,zrr , xnn,ynn,znn ;
00141 double pp_pq , pp_pr , pp_cc ,
00142 qq_pq , qq_qr , qq_cc ,
00143 rr_qr , rr_cc , rr_pr ,
00144 pq_cc , qr_cc , pr_cc , ss ;
00145 double a_pp_pq_cc , a_pp_pr_cc ,
00146 a_qq_pq_cc , a_qq_qr_cc ,
00147 a_rr_qr_cc , a_rr_pr_cc ;
00148
00149 if( npt < 3 || xyz == NULL || wt == NULL ){
00150 fprintf(stderr,"sphere_voronoi: bad inputs\n"); return 0;
00151 }
00152
00153 /* compute convex hull triangular facets */
00154
00155 ntri = qhull_wrap( npt , xyz , &tri ) ;
00156 if( ntri == 0 ){ fprintf(stderr,"sphere_voronoi: qhull_wrap fails\n"); free(xyz); return 0; }
00157
00158 /* initialize output */
00159
00160 ww = (float *) malloc( sizeof(float) * npt ) ;
00161 for( ii=0 ; ii < npt ; ii++ ) ww[ii] = 0.0 ;
00162
00163 for( jj=0 ; jj < ntri ; jj++ ){ /* loop over triangles */
00164
00165
00166 /* triangle vertices pp,qq,rr * pp
00167 / \
00168 / \
00169 pq * * pr
00170 / * \
00171 / cc \
00172 qq *-----------* rr */
00173
00174 pp = tri[3*jj ] ;
00175 xpp = xyz[3*pp ] ; ypp = xyz[3*pp+1] ; zpp = xyz[3*pp+2] ;
00176 qq = tri[3*jj+1] ;
00177 xqq = xyz[3*qq ] ; yqq = xyz[3*qq+1] ; zqq = xyz[3*qq+2] ;
00178 rr = tri[3*jj+2] ;
00179 xrr = xyz[3*rr ] ; yrr = xyz[3*rr+1] ; zrr = xyz[3*rr+2] ;
00180
00181 /* midpoints pq,pr,qr, and centroid cc */
00182 /*** Q: should centroid be replaced by normal?
00183 what about orientation, largeness? ***/
00184
00185 xpq = 0.5*(xpp+xqq) ; ypq = 0.5*(ypp+yqq) ; zpq = 0.5*(zpp+zqq) ;
00186 xpr = 0.5*(xpp+xrr) ; ypr = 0.5*(ypp+yrr) ; zpr = 0.5*(zpp+zrr) ;
00187 xqr = 0.5*(xqq+xrr) ; yqr = 0.5*(yqq+yrr) ; zqr = 0.5*(zqq+zrr) ;
00188
00189 xcc = 0.3333333*(xpp+xqq+xrr) ;
00190 ycc = 0.3333333*(ypp+yqq+yrr) ;
00191 zcc = 0.3333333*(zpp+zqq+zrr) ;
00192
00193 #undef SCL
00194 #define SCL(a,b,c) 1.0/sqrt(a*a+b*b+c*c)
00195
00196 #undef USE_NORMAL
00197 #ifdef USE_NORMAL
00198 # define XCROSS(a,b,c,x,y,z) ((b)*(z)-(c)*(y))
00199 # define YCROSS(a,b,c,x,y,z) ((c)*(x)-(a)*(z))
00200 # define ZCROSS(a,b,c,x,y,z) ((a)*(y)-(b)*(x))
00201 { double apq=xpp-xqq , bpq=ypp-yqq , cpq=zpp-zqq ,
00202 aqr=xqq-xrr , bqr=yqq-yrr , cqr=zqq-zrr ;
00203
00204 xnn = XCROSS(apq,bpq,cpq,aqr,bqr,cqr) ,
00205 ynn = YCROSS(apq,bpq,cpq,aqr,bqr,cqr) ,
00206 znn = ZCROSS(apq,bpq,cpq,aqr,bqr,cqr) ;
00207
00208 cp = SCL(xnn,ynn,znn) ; xnn *= cp ; ynn *= cp ; znn *= cp ;
00209 if( xnn*xcc + ynn*ycc + znn*zcc < 0 ){
00210 xnn = -xnn ; ynn = -ynn ; znn = -znn ;
00211 }
00212 }
00213
00214 # define xVV xnn
00215 # define yVV ynn
00216 # define zVV znn
00217
00218 #else
00219
00220 # define xVV xcc
00221 # define yVV ycc
00222 # define zVV zcc
00223
00224 #endif
00225
00226 /* project pq,pr,qr,cc to sphere (nn is already on sphere) */
00227
00228 cp = SCL(xpq,ypq,zpq) ; xpq *= cp ; ypq *= cp ; zpq *= cp ;
00229 cp = SCL(xpr,ypr,zpr) ; xpr *= cp ; ypr *= cp ; zpr *= cp ;
00230 cp = SCL(xqr,yqr,zqr) ; xqr *= cp ; yqr *= cp ; zqr *= cp ;
00231 cp = SCL(xcc,ycc,zcc) ; xcc *= cp ; ycc *= cp ; zcc *= cp ;
00232
00233 #undef ANG
00234 #define ANG(u1,u2,u3,v1,v2,v3) acos(u1*v1+u2*v2+u3*v3)
00235
00236 /* compute distance on surface between points:
00237 aa_bb = between points aa and bb, from the picture above */
00238
00239 pp_pq = ANG( xpp,ypp,zpp , xpq,ypq,zpq ) ;
00240 pp_cc = ANG( xpp,ypp,zpp , xVV,yVV,zVV ) ;
00241 pp_pr = ANG( xpp,ypp,zpp , xpr,ypr,zpr ) ;
00242
00243 qq_pq = ANG( xqq,yqq,zqq , xpq,ypq,zpq ) ;
00244 qq_qr = ANG( xqq,yqq,zqq , xqr,yqr,zqr ) ;
00245 qq_cc = ANG( xqq,yqq,zqq , xVV,yVV,zVV ) ;
00246
00247 rr_qr = ANG( xrr,yrr,zrr , xqr,yqr,zqr ) ;
00248 rr_pr = ANG( xrr,yrr,zrr , xpr,ypr,zpr ) ;
00249 rr_cc = ANG( xrr,yrr,zrr , xVV,yVV,zVV ) ;
00250
00251 pq_cc = ANG( xpq,ypq,zpq , xVV,yVV,zVV ) ;
00252 qr_cc = ANG( xqr,yqr,zqr , xVV,yVV,zVV ) ;
00253 pr_cc = ANG( xpr,ypr,zpr , xVV,yVV,zVV ) ;
00254
00255 /* for each vertex,
00256 compute areas of 2 subtriangles it touches,
00257 add these into the area weight for that vertex */
00258
00259 #undef SS
00260 #define SS(a,b,c) ((a+b+c)/2)
00261 #undef ATR
00262 #define ATR(s,a,b,c) (4*atan(sqrt(tan(s/2)*tan((s-a)/2)*tan((s-b)/2)*tan((s-c)/2))))
00263
00264 ss = SS(pp_pq,pp_cc,pq_cc) ; /* subtriangle pp,pq,cc */
00265 ww[pp] += a_pp_pq_cc = ATR(ss,pp_pq,pp_cc,pq_cc) ;
00266
00267 ss = SS(pp_pr,pp_cc,pr_cc) ; /* subtriangle pp,pr,cc */
00268 ww[pp] += a_pp_pr_cc = ATR(ss,pp_pr,pp_cc,pr_cc) ;
00269
00270 ss = SS(qq_pq,qq_cc,pq_cc) ; /* subtriangle qq,pq,cc */
00271 ww[qq] += a_qq_pq_cc = ATR(ss,qq_pq,qq_cc,pq_cc) ;
00272
00273 ss = SS(qq_qr,qq_cc,qr_cc) ; /* subtriangle qq,qr,cc */
00274 ww[qq] += a_qq_qr_cc = ATR(ss,qq_qr,qq_cc,qr_cc) ;
00275
00276 ss = SS(rr_qr,rr_cc,qr_cc) ; /* subtriangle rr,qr,cc */
00277 ww[rr] += a_rr_qr_cc = ATR(ss,rr_qr,rr_cc,qr_cc) ;
00278
00279 ss = SS(rr_pr,rr_cc,pr_cc) ; /* subtriangle rr,pr,cc */
00280 ww[rr] += a_rr_pr_cc = ATR(ss,rr_pr,rr_cc,pr_cc) ;
00281
00282
00283 #if 0 /* debugging printouts */
00284 # undef DDD
00285 # define DDD(x,y,z,a,b,c) sqrt((x-a)*(x-a)+(y-b)*(y-b)+(z-c)*(z-c))
00286
00287 cp = DDD(xpp,ypp,zpp,xqq,yqq,zqq) ;
00288 sp = DDD(xpp,ypp,zpp,xrr,yrr,zrr) ;
00289 ca = DDD(xqq,yqq,zqq,xrr,yrr,zrr) ;
00290 sa = (cp+sp+ca)/2 ;
00291 ss = sqrt(sa*(sa-cp)*(sa-sp)*(sa-ca)) ;
00292
00293 fprintf(stderr,"triangle %d: pp=%d qq=%d rr=%d AREA=%6.3f PLANAR=%6.3f\n"
00294 " xpp=%6.3f ypp=%6.3f zpp=%6.3f\n"
00295 " xqq=%6.3f yqq=%6.3f zqq=%6.3f\n"
00296 " xrr=%6.3f yrr=%6.3f zrr=%6.3f\n"
00297 " xpq=%6.3f ypq=%6.3f zpq=%6.3f\n"
00298 " xqr=%6.3f yqr=%6.3f zqr=%6.3f\n"
00299 " xpr=%6.3f ypr=%6.3f zpr=%6.3f\n"
00300 " xcc=%6.3f ycc=%6.3f zcc=%6.3f\n"
00301 #ifdef USE_NORMAL
00302 " xnn=%6.3f ynn=%6.3f znn=%6.3f\n"
00303 #endif
00304 " pp_pq=%6.3f pp_pr=%6.3f pp_cc=%6.3f\n"
00305 " qq_pq=%6.3f qq_qr=%6.3f qq_cc=%6.3f\n"
00306 " rr_qr=%6.3f rr_cc=%6.3f rr_pr=%6.3f\n"
00307 " pq_cc=%6.3f qr_cc=%6.3f pr_cc=%6.3f\n"
00308 " a_pp_pq_cc=%6.3f a_pp_pr_cc=%6.3f\n"
00309 " a_qq_pq_cc=%6.3f a_qq_qr_cc=%6.3f\n"
00310 " a_rr_qr_cc=%6.3f a_rr_pr_cc=%6.3f\n" ,
00311 jj,pp,qq,rr ,
00312 a_pp_pq_cc+a_pp_pr_cc+a_qq_pq_cc+a_qq_qr_cc+a_rr_qr_cc+a_rr_pr_cc , ss ,
00313 xpp, ypp, zpp,
00314 xqq, yqq, zqq,
00315 xrr, yrr, zrr,
00316 xpq, ypq, zpq,
00317 xqr, yqr, zqr,
00318 xpr, ypr, zpr,
00319 xcc, ycc, zcc,
00320 #ifdef USE_NORMAL
00321 xnn, ynn, znn,
00322 #endif
00323 pp_pq, pp_pr, pp_cc,
00324 qq_pq, qq_qr, qq_cc,
00325 rr_qr, rr_cc, rr_pr,
00326 pq_cc, qr_cc, pr_cc,
00327 a_pp_pq_cc, a_pp_pr_cc,
00328 a_qq_pq_cc, a_qq_qr_cc,
00329 a_rr_qr_cc, a_rr_pr_cc ) ;
00330 #endif
00331
00332 } /* end of loop over triangles */
00333
00334 /* exit stage left */
00335
00336 *wt = ww ; return 1 ;
00337 }
|
|
||||||||||||||||||||||||||||
|
Compute SVD of double precision matrix: T [a] = [u] diag[s] [v]
Definition at line 81 of file cs_symeig.c.
00082 {
00083 integer mm,nn , lda,ldu,ldv , ierr ;
00084 doublereal *aa, *ww , *uu , *vv , *rv1 ;
00085 logical matu , matv ;
00086
00087 if( a == NULL || s == NULL || m < 1 || n < 1 ) return ;
00088
00089 mm = m ;
00090 nn = n ;
00091 aa = a ;
00092 lda = m ;
00093 ww = s ;
00094
00095 if( u == NULL ){
00096 matu = (logical) 0 ;
00097 uu = (doublereal *)malloc(sizeof(double)*m*n) ;
00098 } else {
00099 matu = (logical) 1 ;
00100 uu = u ;
00101 }
00102 ldu = m ;
00103
00104 if( v == NULL ){
00105 matv = (logical) 0 ;
00106 vv = NULL ;
00107 } else {
00108 matv = (logical) 1 ;
00109 vv = v ;
00110 }
00111 ldv = n ;
00112
00113 rv1 = (double *) malloc(sizeof(double)*n) ; /* workspace */
00114
00115 (void) svd_( &mm , &nn , &lda , aa , ww ,
00116 &matu , &ldu , uu , &matv , &ldv , vv , &ierr , rv1 ) ;
00117
00118 free((void *)rv1) ;
00119
00120 if( u == NULL ) free((void *)uu) ;
00121 return ;
00122 }
|
|
||||||||||||||||||||||||||||
|
|
|
||||||||||||||||
|
Definition at line 25 of file cs_symeig.c. References a, free, malloc, and rs_(). Referenced by DMAT_symeig(), EIG_func(), EIG_tsfunc(), and main().
00026 {
00027 integer nm , matz , ierr ;
00028 double *fv1 , *fv2 ;
00029
00030 if( a == NULL || e == NULL || n < 1 ) return ;
00031
00032 if( n == 1 ){
00033 e[0] = a[0] ; a[0] = 1.0 ; return ; /* degenerate case */
00034 }
00035
00036 fv1 = (double *) malloc(sizeof(double)*n) ; /* workspaces */
00037 fv2 = (double *) malloc(sizeof(double)*n) ;
00038
00039 nm = n ; matz = 1 ; ierr = 0 ;
00040
00041 rs_( &nm , &nm , a , e , &matz , a , fv1 , fv2 , &ierr ) ;
00042
00043 free((void *)fv1) ; free((void *)fv2) ;
00044 return ;
00045 }
|
|
||||||||||||||||
|
Definition at line 49 of file cs_symeig.c. References a, free, malloc, and rs_(). Referenced by matrix_singvals().
00050 {
00051 integer nm , matz , ierr ;
00052 double *fv1 , *fv2 ;
00053
00054 if( a == NULL || e == NULL || n < 1 ) return ;
00055
00056 if( n == 1 ){ e[0] = a[0] ; return ; } /* degenerate case */
00057
00058 fv1 = (double *) malloc(sizeof(double)*n) ; /* workspaces */
00059 fv2 = (double *) malloc(sizeof(double)*n) ;
00060
00061 nm = n ; matz = 0 ; ierr = 0 ;
00062
00063 rs_( &nm , &nm , a , e , &matz , a , fv1 , fv2 , &ierr ) ;
00064
00065 free((void *)fv1) ; free((void *)fv2) ;
00066 return ;
00067 }
|