void default1D(struct data *d) { struct file fref; struct data ref; struct datablockhead *dbh; int /*dim1,dim2,*/dim3,nr; int i,j; int wref=FALSE; #ifdef DEBUG char function[20]; strcpy(function,"default1D"); /* Set function name */ #endif /* Open data and phasefile file pointers for writing */ openfpw(d,DATA_FILE); openfpw(d,PHAS_FILE); /* Write data and phasefile file headers */ wdfh(d,DATA_FILE); wdfh(d,PHAS_FILE); /* Set data dimensions */ //dim1=d->np/2; //dim2=1; dim3=d->fh.ntraces; nr=d->nr; /* Set nuber of "volumes" */ d->nvols=d->fh.nblocks/nr; /* Check if there is a water reference */ if (spar(d,"ws","y") && spar(d,"wref","y") && spar(d,"wrefstatus","ws")) wref=TRUE; /* Prepare water reference */ if (wref) { setreffile(&fref,d,"waterref"); /* Set reference file */ getpars(fref.procpar[0],&ref); /* Get pars from reference procpar */ opendata(fref.fid[0],&ref); /* Open reference data file fid */ getvol1D(&ref,0,NDCC); /* Get volume without applying dbh.lvl and dbh.tlt */ weightdata1D(&ref,STD,D1); /* Weight data using standard VnmrJ parameters */ } /* Allocate memory for blocks headers from all receivers */ if ((dbh = malloc(nr*sizeof(d->bh))) == NULL) nomem(); /* For spectra we anticipate there is easily sufficient memory for data from all receiver blocks */ for (d->vol=0;d->vol<d->nvols;d->vol++) { /* loop over "volumes" */ for (i=0;i<nr;i++) { /* loop over receivers */ getdbh(d,nr*d->vol+i); /* Get block header */ copydbh(&d->bh,&dbh[i]); /* Store the block headers for writing */ } getvol1D(d,d->vol,NDCC); /* Get data block without applying dbh.lvl and dbh.tlt */ weightdata1D(d,STD,D1); /* Weight data using standard VnmrJ parameters */ if (wref) refcorr1D(d,&ref); /* Phase correct using the reference */ else combine1D(d); /* Combine data from multiple receivers */ zerofill1D(d,STD,D1); /* Zero fill data using standard VnmrJ parameters */ fft1D(d,D1); /* 1D fft */ shiftdata1D(d,STD,D1); /* Shift data to get spectra */ for (i=0;i<nr;i++) { /* loop over receivers */ copydbh(&dbh[i],&d->bh); /* Copy block header for writing */ for (j=0;j<dim3;j++) { d->bh.index=d->vol*nr*dim3+i*dim3+j; /* Set block index */ wdbh(d,DATA_FILE); /* Write block header */ wdbh(d,PHAS_FILE); /* Write block header */ w1Dtrace(d,i,j,DATA_FILE); /* Write block */ w1Dtrace(d,i,j,PHAS_FILE); /* Write block */ } } clear1Ddata(d); /* Clear data "volume" from memory */ } clear1Dall(d); /* Clear everything from memory */ closefp(d,DATA_FILE); closefp(d,PHAS_FILE); }
int main(int argc, char **argv){ FILE *data; double *matriz; int x,y,i,j,a; int m3=0,m1=0,m2=0; data=opendata(argv[1]); countdata(data,&x,&y); //hacer la matriz provisional matriz = loaddata(data,x,y); gsl_matrix_view P =gsl_matrix_view_array(matriz,y,x); // sacar la media para cada dimension gsl_vector *m= gsl_vector_alloc(3); for(i=0;i<x;i++){ for(j=0;j<y;j++){ if(i==0) { m1+= gsl_matrix_get(&P.matrix,j,i); } if(i==1) { m2+= gsl_matrix_get(&P.matrix,j,i); } if(i==2) { m3+= gsl_matrix_get(&P.matrix,j,i); } m1/= y; m2/= y; m3/=y; } } gsl_vector_set(m,0,m1); gsl_vector_set(m,1,m2); gsl_vector_set(m,2,m3); // crear la matriz de covarianza COV gsl_matrix *COV= gsl_matrix_alloc(x,x); for(i=0;i<x;i++){ for(a=0;a<x;a++){ double element=0; for(j=0;j<y;j++){ double ei= gsl_matrix_get(&P.matrix,j,i) - gsl_vector_get(m,i); double ea= gsl_matrix_get(&P.matrix,j,a) - gsl_vector_get(m,a); double ee=ei*ea; element+=ee; } element/= (y-1); gsl_matrix_set(COV,i,a,element); } } // calcular los valores propios de la matriz COV gsl_vector *eval=gsl_vector_alloc(x); gsl_matrix *evec=gsl_matrix_alloc(x,x); gsl_eigen_symmv_workspace *w= gsl_eigen_symmv_alloc(x); gsl_eigen_symmv(COV,eval,evec,w); gsl_eigen_symmv_free(w); gsl_eigen_symmv_sort(eval, evec, GSL_EIGEN_SORT_ABS_DESC); //output FILE *fileout; fileout=fopen("autovectores_3D_data.dat", "w"); for(i=0;i<x-1;i++){ double eval_i= gsl_vector_get(eval,i); gsl_vector_view evec_i = gsl_matrix_column (evec,i); printf("eigenvalue %g\n", eval_i); printf("eigenvector = \n"); gsl_vector_fprintf(stdout, &evec_i.vector, "%g"); float evec_i_0= (float) gsl_vector_get(&evec_i.vector,0); float evec_i_1= (float) gsl_vector_get(&evec_i.vector,1); float evec_i_2= (float) gsl_vector_get(&evec_i.vector,2); fprintf(fileout,"%f %f %f\n", evec_i_0, evec_i_1, evec_i_2); } close(fileout); return 0; }