#include #include #include #include // Lee el valor de los parametros y los asigna a las variables: // cdat - Nombre del archivo de datos // dft - factor de escala void readParams(int argc, char **argv, char *cdat, double *dft) { if(argc>1) strcpy(cdat, argv[1]); if(argc>2) *dft = atof(argv[2]); else *dft = 1.0; } // Lectura del vector en el archivo cfile. // Devuelve NULL si no se pudo abrir el archivo. gsl_vector *readVector(char *cfile) { gsl_vector *vec; int nr; FILE *f1 = fopen(cfile, "rb"); if(!f1) return(NULL); fread(&nr, sizeof(int), 1, f1); vec = gsl_vector_alloc(nr); gsl_vector_fread(f1, vec); fclose(f1); return(vec); } // Escritura del vector vec en el archivo cfile. // Devuelve 0 en caso de exito y 1 si no. int writeVector(gsl_vector *vec, char *cfile) { FILE *f1 = fopen(cfile, "wb"); if(!f1) return(1); fwrite(&(vec->size), sizeof(int), 1, f1); gsl_vector_fwrite(f1, vec); fclose(f1); return(0); } // Imprime en la consola las entradas del vector void printVector(gsl_vector *vec) { unsigned int i; double *ptr = vec->data; for(i=0; isize; ++i) printf("% 6.2f ", ptr[i]); printf("\n"); } // Multiplica por dft a los elementos de la matriz void scaleVector(gsl_vector *vec, double dft) { unsigned int i; double *ptr = vec->data; for(i=0; isize; ++i) ptr[i] *= dft; } int main(int argc, char **argv) { char cfile1[50], cfile2[50]; double dft; // Lectura de los parametros readParams(argc, argv, cfile1, &dft); // Lectura e impresion de la matriz gsl_vector *vec = readVector(cfile1); if(vec==NULL) { printf("El archivo %s no puedo ser leido.\n", cfile1); return(0); } printVector(vec); // Escalamiento del vector y almacenamiento scaleVector(vec, dft); printf("\nVector escalado por el factor %f:\n", dft); printVector(vec); sprintf(cfile2, "scaled%s", cfile1); printf("\nSalida almacena en %s\n", cfile2); writeVector(vec, cfile2); gsl_vector_free(vec); return(0); } // Para compilar // gcc -o vectorGsl vectorGsl.c -lgsl -lgslcblas -lm // Para ejecutar // ./vectorGsl vec1.bin 3