Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Como guardar una Matriz dinamica en un archivo??

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Como guardar una Matriz dinamica en un archivo?? Responder citando

Hola:

Necesito guardar una matriz 3D generada dinamicamente en un archivo en disco, alguien tiene alguna idea de como hacerlo, de la mejor manera(menor coste computacional).

Gracias de antemano.

Saludos.
Volver arriba
Mensaje    Asunto: Responder citando

Hola

Es para algun trabajo de clase ??? lo digo por la expresión "menor coste computacional".

Si lo que deseas es un ejemplo optimizado al maximo, creo que no te puedo ayudar. Pero si lo que quieres es guardar una tabla de tres dimensiones en disco, te puedo decir que hay un monton de formas.
_________________
Salu2
KAYETANO
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Ayuda Responder citando

Hola Kayetano, gracias por responder, pues te cuento que no es para un trabajo de clase, te agradezco si me puedes ayudar con alguna de las formas que mencionas para guardar una tabla de tres dimensiones(la que crees mas conveniente).

Espero tu respuesta,

De nuevo gracias,

Saludos.
Volver arriba
Mensaje    Asunto: Ayuda Responder citando

Kayetano, aun sigo esperando tu respuesta.

......Saludos.
Volver arriba
Mensaje    Asunto: Responder citando

Hola, no te había contestado antes por lo del rendimiento. Este código no está optimizado, pero funciona como tú quieres. Primero el código que escribe la información que tengo en memoria, fíjate que se escriben escalares, vectores y matrices 2D y 3D, además de texto que hacen más legible el fichero (esto último suele ser innecesario, pero yo lo estoy haciendo para un trabajo):

Código:
void __fastcall TFPrincipal::MI_Arc_Gua_DatosClick(TObject *Sender)
  {
  SaveDialog1->Title = "Guardar datos del problema";
  SaveDialog1->DefaultExt = ".PE";
  SaveDialog1->Filter = "Fichero de Programación Estocástica (*.PE)|*.PE";
  SaveDialog1->FileName = FicheroDATOS;
  if (SaveDialog1->Execute())
    {
    f = new TStringList;

    f->Add("n1\tNúmero de variables de primer nivel");
    f->Add(P.n1);
    f->Add("n2\tNúmero de variables de segundo nivel");
    f->Add(P.n2);
    f->Add("m1\tFilas de A");
    f->Add(P.m1);
    f->Add("m2\tFilas de T, W y h");
    f->Add(P.m2);
    f->Add("Escenarios\tNúmero de escenarios");
    f->Add(P.Escenarios);
    f->Add("oculto\tOculto");
    f->Add(P.oculto);
    f->Add("c\tCoeficientes de la función objetivo (variables de primer nivel)");
    for (int k = 0; k < P.n1; k++)
      f->Add(P.c[k]);
    f->Add("minX\tCotas inferiores (variables de primer nivel)");
    for (int k = 0; k < P.n1; k++)
      f->Add(P.minX[k]);
    f->Add("maxX\tCotas superiores (variables de primer nivel)");
    for (int k = 0; k < P.n1; k++)
      f->Add(P.maxX[k]);
    f->Add("A\tElementos de A");
    for (int j = 0; j < P.m1; j++)
      for (int k = 0; k < P.n1; k++)
        f->Add(P.A[j][k]);
    f->Add("b\tb (RHS de A)");
    for (int j = 0; j < P.m1; j++)
      f->Add(P.b[j]);
    f->Add("peso\tPesos de los escenarios");
    for (int i = 0; i < P.Escenarios; i++)
      f->Add(P.peso[i]);
    f->Add("nombre\tNombres de los escenarios");
    for (int i = 0; i < P.Escenarios; i++)
      f->Add(P.nombre[i]);
    f->Add("q\tCoeficientes de la función objetivo (variables de segundo nivel)");
    for (int k = 0; k < P.n2; k++)
      f->Add(P.q[k]);
    f->Add("minY\tCotas inferiores (variables de segundo nivel)");
    for (int k = 0; k < P.n2; k++)
      f->Add(P.minY[k]);
    f->Add("maxY\tCotas superiores (variables de segundo nivel)");
    for (int k = 0; k < P.n2; k++)
      f->Add(P.maxY[k]);
    f->Add("W\tElementos de W (recursiva)");
    for (int j = 0; j < P.m2; j++)
      for (int k = 0; k < P.n2; k++)
        f->Add(P.W[j][k]);
    f->Add("h\th (RHS de W, junto a T)");
    for (int j = 0; j < P.m2; j++)
      f->Add(P.h[j]);
    f->Add("T\tElementos de T");
    for (int i = 0; i < P.Escenarios; i++)
      for (int j = 0; j < P.m2; j++)
        for (int k = 0; k < P.n1; k++)
          f->Add(P.T[i][j][k]);
    f->Add("Fin del problema.");

    try
      {
      FicheroDATOS = SaveDialog1->FileName;
      f->SaveToFile(FicheroDATOS);
      }
    catch (...)
      {
      error("No se ha podido guardar el fichero " + FicheroDATOS);
      }

    delete f;
    }
  }
//-----------------------------------------------------------------------------------------


y con éste código leo el fichero:

Código:
void __fastcall TFPrincipal::MI_Arc_Abr_DatosClick(TObject *Sender)
  {
  OpenDialog1->Title = "Abrir fichero de datos";
  OpenDialog1->DefaultExt = ".PE";
  OpenDialog1->Filter = "Fichero de Programación Estocástica (*.PE)|*.PE";
  OpenDialog1->FileName = FicheroDATOS;
  OpenDialog1->InitialDir = DirDATOS;

  if (OpenDialog1->Execute())
    {
    FicheroDATOS = OpenDialog1->FileName;

    LeeFicheroDatos();
    }
  }
//-----------------------------------------------------------------------------------------
void __fastcall TFPrincipal::LeeFicheroDatos()
  {
  f = new TStringList;

  try
    {
    f->LoadFromFile(FicheroDATOS);
    }
  catch (...)
    {
    ShowMessage("No se pudo abrir el fichero " + FicheroDATOS);
    }

  try
    {
    P.LiberaMemoria();
    }
  catch (...)
    {
    ShowMessage("Error con el manejo de memoria");
    }

  int l = 1;

  try
    {
    //Número de variables de primer nivel
    P.n1 = f->Strings[l++].ToInt();
    l++;
    //Número de variables de segundo nivel
    P.n2 = f->Strings[l++].ToInt();
    l++;
    //Filas de A y b
    P.m1 = f->Strings[l++].ToInt();
    l++;
    //Filas de T, W y h
    P.m2 = f->Strings[l++].ToInt();
    l++;
    //Número de escenarios
    P.Escenarios = f->Strings[l++].ToInt();
    l++;
    //Oculto
    P.oculto = f->Strings[l++];
    l++;
    }
  catch (...)
    {
    ShowMessage("Error al leer las dimensiones del problema.");
    }

  try
    {
    P.ReservaMemoria(false);
    }
  catch (...)
    {
    ShowMessage("Error con el manejo de memoria");
    }

  //Coeficientes de la función objetivo (variables de primer nivel)
  for (int k = 0; k < P.n1; k++)
    P.c[k] = f->Strings[l++].ToDouble();
  l++;

  //Cotas inferiores (variables de primer nivel)
  for (int k = 0; k < P.n1; k++)
    P.minX[k] = f->Strings[l++].ToDouble();
  l++;

  //Cotas superiores (variables de primer nivel)
  for (int k = 0; k < P.n1; k++)
    P.maxX[k] = f->Strings[l++].ToDouble();
  l++;

  //Elementos de A
  for (int j = 0; j < P.m1; j++)
    for (int k = 0; k < P.n1; k++)
      P.A[j][k] = f->Strings[l++].ToDouble();
  l++;

  //b (RHS de A)
  for (int j = 0; j < P.m1; j++)
    P.b[j] = f->Strings[l++].ToDouble();
  l++;

  //Pesos de los escenarios
  for (int i = 0; i < P.Escenarios; i++)
    P.peso[i] = f->Strings[l++].ToInt();
  l++;

  //Nombres de los escenarios
  for (int i = 0; i < P.Escenarios; i++)
    P.nombre[i] = f->Strings[l++];
  l++;

  //Coeficientes de la función objetivo (variables de segundo nivel)
  for (int k = 0; k < P.n2; k++)
    P.q[k] = f->Strings[l++].ToDouble();
  l++;

  //Cotas inferiores (variables de segundo nivel)
  for (int k = 0; k < P.n2; k++)
    P.minY[k] = f->Strings[l++].ToDouble();
  l++;

  //Cotas superiores (variables de segundo nivel)
  for (int k = 0; k < P.n2; k++)
    P.maxY[k] = f->Strings[l++].ToDouble();
  l++;

  //Elementos de W (recursiva)
  for (int j = 0; j < P.m2; j++)
    for (int k = 0; k < P.n2; k++)
      P.W[j][k] = f->Strings[l++].ToDouble();
  l++;

  //h (RHS de W, junto a T)
  for (int j = 0; j < P.m2; j++)
    P.h[j] = f->Strings[l++].ToDouble();
  l++;

  try
    {
    //Elementos de T
    for (int i = 0; i < P.Escenarios; i++)
      for (int j = 0; j < P.m2; j++)
        for (int k = 0; k < P.n1; k++)
          P.T[i][j][k] = f->Strings[l++].ToDouble();
    l++;
    }
  catch (...)
    {
    ShowMessage("Error al leer la matriz T\n\n" +
                AnsiString(P.n1) + " variables de primer nivel\n" +
                AnsiString(P.m1) + " filas de A\n" +
                AnsiString(P.n2) + " variables de segundo nivel\n" +
                AnsiString(P.Escenarios) + " escenarios");
    }

  SB_Principal->Panels->Items[0]->Text = ExtractFileName(FicheroDATOS);
  SB_Principal->Panels->Items[0]->Width =
                   SB_Principal->Canvas->TextWidth(ExtractFileName(FicheroDATOS)) + 10;
  delete f;
  }
//-----------------------------------------------------------------------------------------
void __fastcall TFPrincipal::MI_Arc_Abr_EditorClick(TObject *Sender)
  {
  OpenDialog1->Title = "Abrir fichero en el editor";
  OpenDialog1->DefaultExt = ".MPS";
  OpenDialog1->Filter = "Archivo MPS (*.MPS)|*.MPS";
  OpenDialog1->Filter += "|Archivo de Resultados (*.SOL)|*.SOL";
  OpenDialog1->Filter += "|Archivo de Programación Estocástica (*.PE)|*.PE";
  OpenDialog1->Filter += "|Todos los archivos (*.*)|*.*";
  OpenDialog1->FileName = "";
  OpenDialog1->InitialDir = DirMPS;

  if (OpenDialog1->Execute())
    Notas->Lines->LoadFromFile(OpenDialog1->FileName);
  }
//-----------------------------------------------------------------------------------------


Tiene un buen número de try-catch porque he estado cambiando contiunamente la información de los ficheros, con lo que necesitaba que me avisara de dónde estaba el fallo. Podrías resumirlo en uno sólo. Espero que puedas adaptarlo a lo que necesitas.

Suerte
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Gracias Responder citando

Hola Enrique, muchas gracias por responder, voy a intentar adaptar el codigo que me sugieres, si tengo algun problema escribire nuevamente, espero no tener muchos lios.....


De nuevo gracias.


Saludos.
Volver arriba
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.