1

以下は、boost::multi_array を shape から に再形成するための私のコード[3 4 2]です[12 2]。次元は boost::multi_array で固定されているため、最初に 3 次元配列を形状に再形成[12 2 1]し、次に最初の 2 つの次元を新しい配列にコピーします。

コピーを行わないより簡単な方法はありますか ( numpy.reshapeの精神で元のデータを表示することをお勧めします)。

で実行g++ -g test.cc && ./a.out

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


int                                                                                                                                                                                                                                                                                                                        
main () {                                                                                                                                                                                                                                                                                                                  
  // Create a 3D array that is 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]);                                                                                                                                                                                                                                                                                   

  // indexer can be const a boost::array                                                                                                                                                                                                                                                                                   
  boost::array<array_type::index,3> idx = {{0,0,0}};                                                                                                                                                                                                                                                                       

  // Assign values to the elements                                                                                                                                                                                                                                                                                         
  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++;                                                                                                                                                                                                                                                                                             
  std::cout << "array elements: " << A.num_elements() << std::endl;                                                                                                                                                                                                                                                        
  std::cout << "array ndim: " << A.num_dimensions() << std::endl;                                                                                                                                                                                                                                                          
  std::cout << "array size: " << A.size() << std::endl; // equivalent to a.shape()[0];                                                                                                                                                                                                                                     
  std::cout << "array shape: " << A.shape()[0] <<" " << A.shape()[1] <<" " << A.shape()[2] << std::endl;                                                                                                                                                                                                                   

  int verify = 0;                                                                                                                                                                                                                                                                                                          
  for(index i = 0; i != 3; ++i)                                                                                                                                                                                                                                                                                            
    for(index j = 0; j != 4; ++j)                                                                                                                                                                                                                                                                                          
      for(index k = 0; k != 2; ++k) {                                                                                                                                                                                                                                                                                      
        std::cout << "A[" <<i <<"]["<<j<<"]["<<k<<"] = " << A[i][j][k] << std::endl;                                                                                                                                                                                                                                       
        assert(A[i][j][k] == verify++);                                                                                                                                                                                                                                                                                    
      }                                                                                                                                                                                                                                                                                                                    

  boost::array<array_type::index,3> dims2 = {{12, 2, 1}};                                                                                                                                                                                                                                                                  
  A.reshape(dims2);                                                                                                                                                                                                                                                                                                        

  std::cout << "array shape: " << A.shape()[0] <<" " << A.shape()[1] <<" " << A.shape()[2] << std::endl;                                                                                                                                                                                                                   
  for(index i = 0; i != 12; ++i)                                                                                                                                                                                                                                                                                           
    for(index j = 0; j != 2; ++j)                                                                                                                                                                                                                                                                                          
      for(index k = 0; k != 1; ++k) {                                                                                                                                                                                                                                                                                      
        std::cout << "A[" <<i <<"]["<<j<<"]["<<k<<"] = " << A[i][j][k] << std::endl;                                                                                                                                                                                                                                       
      }                                                                                                                                                                                                                                                                                                                    

  typedef boost::multi_array<double, 2> Array2d;                                                                                                                                                                                                                                                                           
  Array2d B(boost::extents[12][2]);                                                                                                                                                                                                                                                                                        
  for(index i = 0; i != 12; ++i)                                                                                                                                                                                                                                                                                           
    for(index j = 0; j != 2; ++j){                                                                                                                                                                                                                                                                                         
      B[i][j] = A[i][j][0];                                                                                                                                                                                                                                                                                                
      std::cout << "B[" <<i <<"]["<<j<<"] = " << B[i][j] << std::endl;                                                                                                                                                                                                                                                     
    }                                                                                                                                                                                                                                                                                                                      
  return 0;                                                                                                                                                                                                                                                                                                                
}   
4

2 に答える 2

1

一般的なケースではできないと思います。できることは、次元の低いサブビューを生成することです。元の 3D 配列と同じ数の要素を 2D 配列にしたいというコードを読みました。

できることは、3D 配列の既存のデータを次のように再利用することですconst_multi_array_ref

boost::multi_array< int, 3 > a( boost::extents[ 2 ][ 3 ][ 4 ] );
boost::const_multi_array_ref< int, 2 > b( a.data(), boost::extents[ 2 ][ 12 ] );

ストレージの順序によっては、取得しようとしていることが実行される場合があります。

必要なインデックス計算multi_arrayで にアクセスするa の周りに小さなラッパーを書くことをお勧めします。multi_array

于 2013-07-16T13:26:32.970 に答える