[C con Clase] Matrices Multidimensionales

Samuel Díaz García samueldg en arcoscom.com
Dom Mar 23 21:36:22 CET 2014


De forma recursiva.

Samuel Díaz García
El 23/03/2014 21:34, "David ." <di.romero en hotmail.es> escribió:

> Hola a todos,
>
> Tengo una duda sobre cómo recorrer una matriz multidimensional de forma
> genérica.
>
> Ejemplos de recorrido para casos particulares:
>
> -> 1 dimensión:
>
>
> unsigned int d0 = 3;
> double m[d0];
> for (unsigned int i = 0; i < d0; i++){
>
> m[i] = 0;
>
> }
>
> -> 2 dimensiones:
>
> unsigned int d0 = 3;
> unsigned int d1 = 4;
> double m[d0][d1];
> for (unsigned int i = 0; i < d0; i++){
>
> for (unsigned int j = 0; j < d1; j++){
>
> m[i][j] = 0;
>
> }
>
> }
>
> -> 3 dimensiones:
>
> unsigned int d0 = 3;
> unsigned int d1 = 4;
> unsigned int d2 = 5;
> double m[d0][d1][d2];
> for (unsigned int i = 0; i < d0; i++){
>
> for (unsigned int j = 0; j < d1; j++){
>
> for (unsigned int k = 0; k < d2; k++){
>
> m[i][j][k] = 0;
>
> }
>
> }
>
> }
>
> -> 4 dimensiones:
>
> unsigned int d0 = 3;
> unsigned int d1 = 4;
> unsigned int d2 = 5;
> unsigned int d3 = 6;
> double m[d0][d1][d2][d3];
> for (unsigned int i = 0; i < d0; i++){
>
> for (unsigned int j = 0; j < d1; j++){
>
> for (unsigned int k = 0; k < d2; k++){
>
> for (unsigned int l = 0; l < d3; l++){
>
> m[i][j][k][l] = 0;
>
> }
>
> }
>
> }
>
> }
>
> Como podéis ver, se necesitan tantos bucles for como dimensiones tenga la
> matriz.
>
> Lo que quiero es hacer un algoritmo que recorra una matriz
> multidimensional de forma génerica, es decir, sabiendo el número de
> dimensiones y las dimensiones de una matriz multidimensional, recorrer
> todos sus elementos. Por ejemplo, sería implementar esta función:
>
> /**
>  * Recorre la matriz multidimensional dada, asignándole a todos sus
> valores el valor 0
> * @param numeroDimensiones El número de dimensiones de la matriz
> multdimensional
> * @param dimensiones Un puntero al primer elemento de un array de unsigned
> ints del mismo tamaño que el
> * número de dimensiones dado, de forma que el elemento i-ésimo es la
> dimensión i-ésima de la matriz multidimensional
> * @param matrizMultidimensional Un puntero al primer elemento de la matriz
> multidimensional
>  */
>
> void asignarCeros(unsigned int numeroDimensiones, unsigned int*
> dimensiones, double* matrizMultidimensional){
>
> // ¿Cómo recorrer la matriz multidimensional?
>
> }
>
> Esta función se utilizaría así, por ejemplo:
>
> // 1 dimensión //
>
>
> unsigned int numeroDimensiones = 1;
> unsigned int dimensiones [1] = {3};
> double matrizMultidimensional[3];
> asignarCeros(numeroDimensiones, dimensiones, matrizMultidimensional);
>
> // 2 dimensiones //
>
>
> unsigned int numeroDimensiones = 2;
> unsigned int dimensiones [2] = {3, 4};
> double matrizMultidimensional[3][4];
> asignarCeros(numeroDimensiones, dimensiones, matrizMultidimensional);
>
> // 3 dimensiones //
>
> unsigned int numeroDimensiones = 3;
> unsigned int dimensiones [3] = {3, 4, 5};
> double matrizMultidimensional[3][4][5];
> asignarCeros(numeroDimensiones, dimensiones, matrizMultidimensional);
>
> // 4 dimensiones //
>
>
> unsigned int numeroDimensiones = 4;
> unsigned int dimensiones [4] = {3, 4, 5, 6};
> double matrizMultidimensional[3][4][5][6];
> asignarCeros(numeroDimensiones, dimensiones, matrizMultidimensional);
>
> ¿alguna idea de cómo implementar la función asignarCeros?
>
> Gracias.
>
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20140323/d40526ec/attachment.html>


Más información sobre la lista de distribución Cconclase