2010-02-01 47 views

Respuesta

58

La matriz en su pregunta tiene sólo un elemento, por lo que sólo necesita un valor para inicializar completamente. Necesitas tres juegos de llaves, uno para cada dimensión de la matriz.

int min[1][1][1] = {{{100}}}; 

un ejemplo más claro podría ser:

int arr[2][3][4] = { { {1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 4} }, 
        { {1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 4} } }; 

Como se puede ver, hay dos grupos, cada uno con tres grupos de 4 números.

+1

Sí, sí, por supuesto que estés, estas varias matrices D correctas me mantiene eludir ... –

+0

funciona eso en C? – miguelSantirso

+2

Sí, eso funcionará en C también. –

8

En lugar de matrices multidimensionales estáticas, probablemente debería utilizar una matriz unidimensional y calcular el índice por multiplicación. P.ej.

class Array3D { 
    size_t m_width, m_height; 
    std::vector<int> m_data; 
    public: 
    Array3D(size_t x, size_t y, size_t z, int init = 0): 
     m_width(x), m_height(y), m_data(x*y*z, init) 
    {} 
    int& operator()(size_t x, size_t y, size_t z) { 
     return m_data.at(x + y * m_width + z * m_width * m_height); 
    } 
}; 

// Usage: 
Array3D arr(10, 15, 20, 100); // 10x15x20 array initialized with value 100 
arr(8, 12, 17) = 3; 

std :: vector asigna dinámicamente el almacenamiento, lo cual es una buena cosa porque el espacio de pila es a menudo muy limitada y matrices 3D utilizar fácilmente una gran cantidad de espacio. Envolverlo en una clase como esa también hace que pasar la matriz (por copia o por referencia) a otras funciones sea trivial, mientras que hacer cualquier paso de arreglos estáticos multidimensionales es muy problemático.

El código anterior es simplemente un ejemplo y podría optimizarse y hacerse más completo. También existen implementaciones existentes de esto en varias bibliotecas, pero no conozco ninguna.

+1

Para las bibliotecas existentes, hay Boost.MultiArray y Boost.uBlas (www.boost. org). Este último está más adaptado al álgebra lineal. Piense en Boost como una extensión de la biblioteca estándar de C++ (o "The Stuff They Left Out of the Language and Standard Library (TM)"). –

+0

@Emile: No he votado negativamente, pero 'new int [2] [3] [4]' haría el truco. En cuanto al código de @ Tronic, solo duplica el esfuerzo de 'std :: valarray'. – Potatoswatter

+1

std :: vector es esencialmente un buen wrapper RAII para new []/delete [] (y también hace algunas otras cosas) así que siempre lo prefiero a manejar la memoria manualmente. Por supuesto, aquí se desperdician algunos bytes para hacer un seguimiento del tamaño del contenedor, pero por otro lado se puede usar para calcular las dimensiones de la matriz 3D. No veo qué tiene que ver std :: valarray con esto, ya que no he definido ninguna operación aritmética para la matriz y valarray no sabe cómo aparecer como una matriz multidimensional. – Tronic

3

Todo el mundo parece olvidar std::valarray. Es la plantilla STL para matrices multidimensionales planas, y las indexa y las corta.

http://www.cplusplus.com/reference/std/valarray/

Sin inicialización estática, sino que es realmente esencial?

+0

Sus comentarios/respuesta me hicieron generar una pregunta en std :: valarray: http://stackoverflow.com/questions/2187648/how-can-i-use-a-stdvalarray-to-store-manipulate-a-2d- formación –

6

Aquí hay otra forma de asignar dinámicamente una matriz 3D en C++.

int dimX = 100; int dimY = 100; int dimZ = 100; 
int*** array; // 3D array definition; 
// begin memory allocation 
array = new int**[dimX]; 
for(int x = 0; x < dimX; ++x) { 
    array[x] = new int*[dimY]; 
    for(int y = 0; y < dimY; ++y) { 
     array[x][y] = new int[dimZ]; 
     for(int z = 0; z < dimZ; ++z) { // initialize the values to whatever you want the default to be 
      array[x][y][z] = 0; 
     } 
    } 
}