Lo que deseo real ayuda y eso pueden verlo en una pregunta que nadie ha contestado aún (ver tema: Vectores y variables locales (Trate de hacer enlace pero necesito tener antiguedad )) es: mi vectores están declarados reservando un espacio max. En la línea 9 del programa se define max 500. Pero eso es insuficiente para lo que necesito. Yo necesito por lo menos max 500000. Sabemos que es mucha memoria y que el sistema operativo debería encargarse de eso pero adicionalmente sabemos que el espacio para vectores se reserva por bloques. Una librería que ya incluí llamada vector resuelve el problema, pero no logro usar sus vectores como argumento de otras funciones (ver tema: Vectores y variables locales ) y ese, ESE es el problema que necesito resolver.
Esto es parte de mi tesis y ya tengo mucho tiempo trabajando en ella (no estudio un área de la computación aunque mi tesis sea la elaboración de un programa) deseo graduarme.
Muchas gracias, pueden quedarse con el código. Apoyo el software libre :)
PD: Lyuego pedire ayuda para la graficacion de esos datos en superficies
Código:
//------------------------------------------------------------------------------ // Programa para crear un grig regular a partir de datos X,Y,Z v1.0 //------------------------------------------------------------------------------ #include <cstdlib> #include <iostream> #include <vector> #include <cmath> //------------------------------------------------------------------------------ #define max 500 //------------------------------------------------------------------------------ int Lee_N(void); //Lee numero de elementos. void Lee_datos(double A[][3], int N); //Lee datos para crear grid. void Genera_grid(double A[][3], double grid[][3], int N, int *NG); //genera una nueva matriz con los datos de la matriz original. void ExtraeVector(double A[][3], int N, double V[max], int objetivo); double maximo(double V[max], int N); double minimo(double V[max], int N); void Genera_coordenadas(double X[], int Nx, double Y[], int Ny, double grid[][3], int NGrid); //double espaciado(); void Calcula_nuevo_Z(double A[][3], double grid[][3], int N, int Ngrid, double Radio); double DistEntrePuntos(double a[], double b[]); double promedio(double matriz[max], int N); void ImprimeMatriz(double matriz[][3], int Ngrid); //------------------------------------------------------------------------------ using namespace std; int main(int argc, char *argv[]) { int NDatos, NGrid; double Datos[max][3], Grid[max][3]; NDatos = Lee_N(); Lee_datos(Datos, NDatos); Genera_grid(Datos, Grid, NDatos, &NGrid); ImprimeMatriz(Grid, NGrid); system("PAUSE"); return EXIT_SUCCESS; } //------------------------------------------------------------------------------ int Lee_N(void) { int Temp; do { cout << "Introduzca numero de datos: "; cin >> Temp; if(Temp<2 || Temp>max) cout << "\tERROR: El numero de datos debe ser > 1 y <= " << max<<endl; } while(Temp<2 || Temp>max); return Temp; } //------------------------------------------------------------------------------ void Lee_datos(double A[][3], int N) { cout << "\nIntroduzca los datos de la matriz"<<endl<<endl; for(int i=0; i<N;i++) { for(int j=0; j<3; j++) { char coordenada; switch(j) { case 0: coordenada = 'X';break; case 1: coordenada = 'Y';break; case 2: coordenada = 'Z';break; default: break; } cout << "Datos["<<i+1<<"]["<<coordenada<<"]: "; cin >> A[i][j]; } cout << endl; } } //------------------------------------------------------------------------------ void Genera_grid(double A[][3], double grid[][3], int N, int *NG) { double minX, maxX, minY, maxY; //Límites del grid int Nf, Nc, tempNG; //cantidad de filas y cantidad de columnas. double DeltaX, DeltaY; //nuevo muestreo en X y Y double X[max]; double Y[max]; double Radio; int obj = 0; //Indica la columna 1 dentro de la matriz ExtraeVector(A, N, X, obj); obj = 1; //Indica la columna 2 dentro de la matriz ExtraeVector(A, N, Y, obj); minX = minimo(X, N); maxX = maximo(X, N); minY = minimo(Y, N); maxY = maximo(Y, N); cout << "Los limites del grid son: " << endl; cout << "\tMinX: " << minX << endl; cout << "\tMaxX: " << maxX << endl; cout << "\tMinY: " << minY << endl; cout << "\tmaxY: " << maxY << endl; cout << "Introduzca la cantidad de filas: "; //Cantidad de filas que tendra el grid. cin >> Nf; cout << "Introduzca la cantidad de columnas: "; //Cantidad de columnas que tendra el grid. cin >> Nc; DeltaX = (maxX-minX)/(Nc-1); //Calcula el nuevo muestreo en X para el grid DeltaY = (maxY-minY)/(Nf-1); //Calcula el nuevo muestreo en Y para el grid X[0] = minX; //Vuelve a generar el vector X, pero remuestreado for(int i=1; i<Nc; i++) X[i] = X[i-1] + DeltaX; Y[0] = minY; //Vuelve a generar el vector X, pero remuestreado for(int i=1; i<Nf; i++) Y[i] =Y[i-1] + DeltaY; tempNG = Nc*Nf; //Calcula el numero de renglones que tendra el grid. Genera_coordenadas(X, Nc, Y, Nf, grid, tempNG); //genera los nuevos X y Y en el grid cout << "\nIndroduzca radio de busqueda: "; cin >> Radio; Calcula_nuevo_Z(A, grid, N, tempNG, Radio); *NG = tempNG; } //------------------------------------------------------------------------------ void ExtraeVector(double A[][3], int N, double V[max], int objetivo) { for(int i=0; i<N; i++) V[i] = A[i][objetivo]; cout << endl; } //------------------------------------------------------------------------------ double maximo(double V[max], int N) { double temp = V[0]; for(int i=1; i<N; i++) if(temp < V[i]) temp = V[i]; return temp; } //------------------------------------------------------------------------------ double minimo(double V[max], int N) { double temp = V[0]; for(int i=1; i<N; i++) if(temp > V[i]) temp = V[i]; return temp; } //------------------------------------------------------------------------------ void Genera_coordenadas(double X[], int Nx, double Y[], int Ny, double grid[][3], int NGrid) { int z = 0; for(int i=0; i<Nx; i++) for(int j=0; j<Ny; j++) { grid[z][0] = X[i]; grid[z][1] = Y[j]; z++; } } //------------------------------------------------------------------------------ void Calcula_nuevo_Z(double A[][3], double grid[][3], int N, int Ngrid, double Radio) { double Z_en_Area[max]; double a[2], b[2]; int contadorZ = 0; for(int i=0; i<Ngrid; ++i) { a[0] = grid[i][0]; a[1] = grid[i][1]; for(int j=0; j<N; ++j) { b[0] = A[j][0]; b[1] = A[j][1]; if(DistEntrePuntos(a, b)<=Radio) { Z_en_Area[contadorZ] = A[j][2]; contadorZ ++; } } grid[i][2] = promedio(Z_en_Area, contadorZ); contadorZ = 0; } } //------------------------------------------------------------------------------ double DistEntrePuntos(double a[], double b[]) { double g = sqrt((a[0]-b[0])*(a[0]-b[0])+(a[1]-b[1])*(a[1]-b[1])); return g; //Calcula la distancia entre los puntos } //------------------------------------------------------------------------------ double promedio(double matriz[max], int N) { double suma = 0; for(int i=0; i<N; ++i) { suma += matriz[i]; //Suma de valores de la matriz } return suma/N; //Retorna la media aritmetica } //------------------------------------------------------------------------------ void ImprimeMatriz(double matriz[][3], int N) { for(int i=0;i<N;i++) { for(int j=0;j<3;j++) { cout<<"\t"<<matriz[i][j]; } cout << endl; } } //------------------------------------------------------------------------------