creat una multdimentional matriz para almacenar muchas matrices de diferentes tamaños en C

Le hice esta pregunta, pero he eliminado porque no estaba claro. Tengo tres bucles que producen 0, 1 los datos. Me gustaría guardarlas como una matriz por eso creo que debería ser almacenados en una matriz multidimensional que yo llamo Third.

for (i=0; i<m; i++) {
    for (int l = 0; l < n2; ++l) {
        for (x = 0; x < all[i].n; ++x) {
            f = (int)VECTOR(v2)[l];
            if(a[x].vto == f) {
                printf("%d",1);
            } else {
                printf("%d",0);
            }
        }
    }
    for (int y = 0; y < n1; ++y) {
        for (x = 0; x < all[i].n; ++x) {
            q = (int)VECTOR(v1)[y];
            if(a[x].vfrom == q) {
                printf("%d",1);
            } else {
                printf("%d",0);
            }
        }
    }
    printf("\n");  
}

El resultado impreso desde el código anterior es y me gustaría guardarlo en esta forma:

100010001111
111000000111100100010010001001
111000000000111000000000111100100100010010010001001001
110000001100000011101010010101
111100010001

Mi objetivo es almacenar el resultado impreso en una matriz como

Third = = [ [[100][010][001][111]] [[111000][000111][100100][010010][001001]]...[[111][100][010][001]]

así que si quiero acceder a la matriz Third yo Third[3] = [ [110000] [001100] [000011] [101010] [010101] ] o Third[3][1] = [001100] o Third[3][1][2] = 1.

Yo sería muy feliz para aclarar cualquier cosa que no sea claro. Gracias por la ayuda

EDIT 1: El código es demasiado grande para ser añadido por completo. Me preguntó acerca de la forma en general para lograr lo que yo estoy buscando, que es cómo construir una matriz multidimensional o un array de arrays para almacenar los datos de los resultados de cualquiera de las tres bucles anidados (no es necesario, mi bucles). Me fijo el presente código, así que ahora la matriz Third contiene todos los datos, pero no creo que sea la manera correcta de almacenar los datos para poder acceder a él más tarde como Third[3] = [ [110000] [001100] [000011] [101010] [010101] ]

Aquí es lo que yo hice:

  int second[n1+n2][n1*n2];
  int first[n1*n2];
  int Third[m][n1+n2][n1*n2];

for (i=0; i<m; i++) {
  Data * a = all[i].datas;
  igraph_edge(&graph, i, &from, &to);
  igraph_neighbors(&graph, &v1, from, IGRAPH_ALL);
  igraph_neighbors(&graph, &v2, to, IGRAPH_ALL);

  int n2 = igraph_vector_size(&v2);
  int n1 = igraph_vector_size(&v1);
  int f, q, x, l, y;




      for (l = 0; l < n2; ++l) {
        for (x = 0; x < all[i].n; ++x) {
                    f = (int)VECTOR(v2)[l];
                        if(a[x].vto == f) {
                                           first[x]=1;
                        } else {
                                            first[x]=0;
                          }
                    second[l][x] = first[x];
                    Third[i][l][x]  = second[l][x]; 
                    printf("%d", Third[i][l][x]); 
         }
       }

          for (y = 0; y < n1; ++y) {
              for (x = 0; x < all[i].n; ++x) {
                  q = (int)VECTOR(v1)[y];
                        if(a[x].vfrom == q) {
                                              first[x]=1;
                         } else {
                                              first[x]=0;
                           }
                                        second[y+n2][x] = first[x];
                                        Third[i][y+n2][x]  = second[y+n2][x];
                                        printf("%d", Third[i][y+n2][x]); 
                }
           }
         printf("\n");  
    }

al compilar el código anterior puedo conseguir

100010001111
111000000111100100010010001001
111000000000111000000000111100100100010010010001001001
110000001100000011101010010101
111100010001

No estoy seguro de si esta es la manera correcta de hacerlo?gracias

EDIT 2:

Me pregunto si la declaración de este modo como a continuación es correcto o no? Es el modelo de tres dimensiones de la matriz Third de tamaño fijo o es (según sea necesario) dinámicos de acuerdo a n1 y n2 que cambia dependiendo de la iteración de i.

  int second[n1+n2][n1*n2];
  int first[n1*n2];
  int Third[m][n1+n2][n1*n2];


  for (i=0; i<m; i++) {
  Data * a = all[i].datas;
  igraph_edge(&graph, i, &from, &to);
  igraph_neighbors(&graph, &v1, from, IGRAPH_ALL); //initialize the vector v2 where it's values and it's size vary depending on i
  igraph_neighbors(&graph, &v2, to, IGRAPH_ALL); //initialize the vector v2 where it's values and it's size vary depending on i

  int n2 = igraph_vector_size(&v2); // the size changes depending on i, i.e the change from an iteration to another
  int n1 = igraph_vector_size(&v1); // the size changes depending on i, i.e the change from an iteration to another
  int f, q, x, l, y;


      for (l = 0; l < n2; ++l) {
        for (x = 0; x < all[i].n; ++x) {
                    f = (int)VECTOR(v2)[l];
                        if(a[x].vto == f) {
                                           first[x]=1;
                        } else {
                                           first[x]=0;
                          }
                    second[l][x] = first[x];
                    Third[i][l][x]  = second[l][x]; 
         }
      }
   }

1 Respuestas

  • Cacahuete Frito
    3 de mayo de 2019

    Desea que este:

    Third = [ [[100][010][001][111]] [[111000][000111][100100][010010][001001]]...[[111][100][010][001]] ];
    

    Voy a suponer que el tipo de datos que desea es bool, pero podría ser cualquiera.

    Esto no se puede lograr exactamente en C, como todos los elementos de un array deben ser del mismo tipo, y que incluye su tamaño cuando estamos hablando acerca de las matrices.


    Opción 1:

    Pero tenemos por ejemplo *argv[], que es un array de punteros, pero como punteros pueden comportarse como matrices, que efectivamente tienen algo como esto (después de su misma gramática):

    *argv[] = [ [program\0][arg1\0][arg2\0] ]
    

    Algo similar a lo que usted desea, podría ser:

    void *third[n];
    

    Y suponiendo que se tienen todos su segundo matrices definidas como

    bool second_0[4][3];
    bool second_1[5][6];
    ...
    bool second_n[4][3];
    

    Entonces usted puede unirse a ellos en third como este:

    third[0] = &second_0;
    third[1] = &second_1;
    ...
    third[n] = &second_n;
    

    Y usted podría usar third como esto: digamos que usted desea extraer el elemento [i][j][k] en una variable temporal, y vamos a suponer que la matriz second_i tiene tamaños second_i[n][m]:

    bool tmp = (*(bool (*)[n][m])third[i])[j][k];
    

    El uso no es muy agradable, pero es la cosa más cercana que puede tener lo que usted desea.


    Opción 2 (de preferencia):

    Usted puede tener una gran variedad como esto: bool third[100][20][30];, que puede tener siempre más números que en su mayor esperada segunda matriz, y acaba de salir como 0 los valores no utilizados. Se utilizará más memoria, pero no necesita ningún moldes o punteros, y va a ser mucho más rápido, como todos los de la memoria del ser contiguos.

    Si utiliza esta opción, se necesita una variable adicional

    ptrdiff_t third_sizes[ARRAY_SIZE(third)][2];
    

    para almacenar los tamaños de cada segundo de la matriz, de modo que usted puede mantener un registro de qué parte se han utilizado (con la primera opción que usted necesita es demasiado). ARRAY_SIZE() debe ser definida de la siguiente forma:

    #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))