2010-11-18 9 views
11

Después de mirar la documentación no puedo entender esto.¿Cuál es la diferencia entre boost :: multi_array vistas y subarrays

Puedo escribir código como

typedef boost::multi_array<boost::int32_t, 3> data_t; 

// 3d -- 
typedef data_t::array_view<3>::type data_3d_view_t; 

// 2d -- 
typedef data_3d_view_t::reference data_2d_subarray_t; 
typedef data_t::array_view<2>::type data_2d_view_t; 

Entonces puedo acceder a una rebanada 2d utilizando a través de los tipos data_2d_subarray_t o data_2d_view_t.

¿Cuál es la diferencia entre ellos?
¿Qué puedo hacer con uno que no puedo hacer con el otro?
¿Hay alguna diferencia de rendimiento?

Muchas gracias por aclararme esto. Saludos cordiales, rodrigob.

Respuesta

5

De la tabla de MultiView associated types:

referencia Este es el tipo de referencia del valor contenido. Si NumDims == 1, entonces este es el elemento &. De lo contrario, este es el mismo tipo que el subarreglo de plantilla :: tipo.

plantilla array_view :: type Este es el tipo de vista con dimensiones Dims. Lo devuelve el operador de llamadas. Modela MultiArray.

por lo que son diferentes tipos, para empezar. En este contexto, las vistas representan una especie de subcolección de un MultiArray. Implementan el concepto MultiArray, pero los elementos que contienen son en realidad elementos de algún otro MultiArray. Las vistas le permiten definir un nuevo index en los elementos de un MultiArray. Por ejemplo, podría definir una vista que invierta el índice, de modo que el primer elemento de la vista sea el último elemento del MultiArray. Desde el documentation:

Una vista le permite tratar un subconjunto de los elementos subyacentes en un multiarray como si se tratara de un multiarray separada. Como una vista se refiere a los mismos elementos subyacentes, los cambios realizados en los elementos de una vista se reflejarán en el MultiArray original.

MultiArrays se definen recursivamente; un MultiArray de dimensión n> 1 se puede considerar como una matriz de MultiArrays de dimensión n -1, que son subconjuntos. La diferencia clave entre un subcampo y una vista es que puede dividir un MultiArray en vistas de dimensiones inferiores a lo largo de cualquier eje, incluido el eje principal, pero los subcampos no se pueden dividir a lo largo del eje principal.

data_t d3(boost::extents[4][5][6]); 
data_2d_view_t d2_view = d3[boost::indices[range(0,4,2)][1][range(0,6,3)]]; 
data_2d_subarray_t d2_sub = d3[1]; 
// the following, and anything like it, won't work 
data_2d_subarray_t d2_sub_b = d3[range(0,4,2)][0]; 

No creo que haya ninguna diferencia de rendimiento importante, aunque esto depende del tipo de índice que use al crear una vista. Las vistas pueden ser un poco menos performantes, pero no en un gran sentido O.

+0

¡Gracias por la respuesta! ¡Eso es exactamente lo que estaba buscando! Aunque basado en mi experiencia previa http://stackoverflow.com/questions/446866/boostmulti-array-performance-question/4220976#4220976, creo que, en general, los submatrices son mucho más eficaces que las vistas (en una "k" en el lateral del gran sentido de O ") – rodrigob

Cuestiones relacionadas