I too would like answers to these questions.
I tried:
template <typename T>
void display_array_3d( T& array_3d )
{
int z_dim = array_3d.shape()[0];
int y_dim = array_3d.shape()[1];
int x_dim = array_3d.shape()[2];
if( x_dim > 0 && y_dim > 0 ){
for( int z = 0; z < z_dim; z++ ){
for( int y = 0; y < y_dim; y++ ){
for( int x = 0; x < x_dim; x++ ){
printf( "\t%f", array_3d[z][y][x] );
}
printf( "\n" );
}
printf( "\n" );
}
return;
}
if( y_dim > 0 ){
for( int z = 0; z < z_dim; z++ ){
for( int y = 0; y < y_dim; y++ ){
printf( "\t%f", array_3d[z][y] );
}
printf( "\n" );
}
return;
}
if( z_dim > 0 ){
for( int z = 0; z < z_dim; z++ ){
printf( "\t%f", array_3d[z] );
}
return;
}
}
void test_3d_to_2d_matrix( void )
{
int z_dim = 2;
int y_dim = 3;
int x_dim = 4;
boost::shared_ptr<float> array_3d_data = boost::shared_ptr<float>( new float[x_dim * y_dim * z_dim] );
for( int i = 0; i< x_dim * y_dim * z_dim; i++){
(array_3d_data.get())[i] = i;
}
typedef boost::multi_array_ref<float, 3> array_type;
typedef array_type index;
array_type a_3d_array( array_3d_data.get(), boost::extents[z_dim][y_dim][x_dim] );
printf( "a_3d_array\n" );
display_array_3d<array_type>( a_3d_array );
boost::multi_array<float, 2> t_mat = eye( 4, 4 );
typedef boost::multi_array_types::index_range range;
array_type::index_gen indices;
for( int mat_i = 0; mat_i < z_dim; mat_i++ )
{
array_type::array_view<3>::type p_mat_view = a_3d_array[ boost::indices[range(mat_i, mat_i)][range(0,2)][range(0,3)] ];
//display_matrix<float,3>( p_mat_view );
}
array_type::array_view<3>::type row_1 = a_3d_array[ boost::indices[range(0, z_dim)][range(0,1)][range(0,1)] ];
array_type::array_view<3>::type row_2 = a_3d_array[ boost::indices[range(0, z_dim)][range(1,2)][range(0,1)] ];
printf( "row_1\n" );
display_array_3d<array_type::array_view<3>::type>( row_1 );
printf( "\n" );
printf( "row_2\n" );
display_array_3d<array_type::array_view<3>::type>( row_2 );
printf( "\n" );
printf( "swap\n" );
std::swap( row_1, row_2 );
printf( "row_1\n" );
display_array_3d<array_type::array_view<3>::type>( row_1 );
printf( "\n" );
printf( "row_2\n" );
display_array_3d<array_type::array_view<3>::type>( row_2 );
printf( "\n" );
printf( "a_3d_array\n" );
display_array_3d<array_type>( a_3d_array );
}
int main( void )
{
test_3d_to_2d_matrix();
}
and received:
a_3d_array
0.000000 1.000000 2.000000 3.000000
4.000000 5.000000 6.000000 7.000000
8.000000 9.000000 10.000000 11.000000
12.000000 13.000000 14.000000 15.000000
16.000000 17.000000 18.000000 19.000000
20.000000 21.000000 22.000000 23.000000
row_1
0.000000
12.000000
row_2
4.000000
16.000000
swap
row_1
4.000000
16.000000
row_2
4.000000
16.000000
a_3d_array
4.000000 1.000000 2.000000 3.000000
4.000000 5.000000 6.000000 7.000000
8.000000 9.000000 10.000000 11.000000
16.000000 13.000000 14.000000 15.000000
16.000000 17.000000 18.000000 19.000000
20.000000 21.000000 22.000000 23.000000
which is not what I was expecting... but almost
And I am only left with more questions like
5) how to create views which are a minimum number of dimensions
such as:
array_type::array_view<1>::type row_1 = a_3d_array[
boost::indices[range(0, z_dim)][range(0,1)][range(0,1)] ];
and not:
array_type::array_view<3>::type row_1 = a_3d_array[
boost::indices[range(0, z_dim)][range(0,1)][range(0,1)] ];
with out getting:
2>..\..\..\..\..\source\Matlab\lib\dsaLib\matrix\src\matrix_test_app.cpp(82) : error C2440: 'initializing' : cannot convert from 'boost::detail::multi_array::multi_array_view<T,NumDims>
due to the dimensionality miss match.