2011-04-29 19 views
5

Necesito ayuda para usar la matriz multidimensional de impulso. Tengo que construir una matriz de dos dimensiones, donde: (0 < = j < = 1) y (i) crece dinámicamente de acuerdo con:¿Cómo se usa (la Biblioteca de matrices multidimensionales Boost) para construir una matriz bidimensional dinámica?

long boostArray[i][j]; 

lo tanto, es como construir una tabla de columnas (desconocidos) y dos filas .

que ya se inició con el ejemplo proporcionado en el sitio web de Boost Biblioteca:

#include "boost/multi_array.hpp" 
#include <cassert> 

int main() { 
    // 3 x 4 x 2 
    typedef boost::multi_array<double, 3> array_type; 
    typedef array_type::index index; 
    array_type A(boost::extents[3][4][2]); 

    int values = 0; 
    for(index i = 0; i != 3; ++i) 
    for(index j = 0; j != 4; ++j) 
     for(index k = 0; k != 2; ++k) 
     A[i][j][k] = values++; 

    int verify = 0; 
    for(index i = 0; i != 3; ++i) 
    for(index j = 0; j != 4; ++j) 
     for(index k = 0; k != 2; ++k) 
     assert(A[i][j][k] == verify++); 

    return 0; 
} 

El problema es que yo no entendía bien el código anterior con el fin de modificar en su estructura y construir mi matriz deseada No sé exactamente cómo agregar/eliminar elementos a/desde mi matriz mientras uso la Biblioteca Boost, especialmente si esta matriz crece dinámicamente como describí anteriormente.

Por ejemplo, cuando se trata de vectores, que tienden a utilizar: push_back y pop_back después de cambiar el tamaño del vector.

Respuesta

2

Para su caso de uso particular, probablemente sea mejor que use vector<pair<T,T>> o vector<array<T,2>>. Luego puede usar push_back, y es eficiente. boost::multi_array suena como una exageración, Otoh:

Usted no puede usar algo como push_back allí, porque cada vez que se extienda una dimensión de una N gama dimensional, que había necesidad de suministrar una rebanada de N-1 dimensiones de los datos iniciales. Eso usualmente no es muy eficiente, esp. ya que solo puede agregar a la dimensión con el mayor paso de esta manera. Lo que necesita usar en su lugar es resize y asignación.

// std::vector<> equivalent (with vector<>, it's considered bad style) 
v.resize(v.size() + 1); 
v[v.size()-1] = newElement; 

// boost::multi_array (from the tutorial) 
typedef boost::multi_array<int, 3> array_type; 

array_type::extent_gen extents; 
array_type A(extents[3][3][3]); 
A[0][0][0] = 4; 
A[2][2][2] = 5; 
// here, it's the only way: 
A.resize(extents[2][3][4]); 
assert(A[0][0][0] == 4); 
// A[2][2][2] is no longer valid. 

Reiterar: N arrays -dimensional, N>2, son inherentemente mucho menos dinámico que los unidimensionales (debido al factor de zancada). El cambio de tamaño anterior requiere una gran cantidad de copia de los datos, a diferencia del caso vectorial, que solo necesita copiar datos cuando size()>capacity().

Cuestiones relacionadas