7

次のように初期化する n 次元の Boost.MultiArray があります。

const int n=3, size=4; //# of dimensions and size of one dimension
boost::multi_array<char,n> arr;
boost::array<size_t,n> extents; //size of each dimension
extents.assign(size); //assign size to each dimension -> {{4, 4, 4}}
arr.resize(extents);

したがって、MultiArray を取得するためのコードは 4 行ありますが、1 行で実行したいと考えています。sizeそれぞれの長さが n 次元の MultiArray を生成する簡単な方法はありますか(したがって、 と書くことができますarr(samevaluearray(n,size)))、または MultiArray の便利なコンストラクターを見逃していましたか?

編集: n の特定の値に依存せずに機能するはずです。つまり、 に対してarr({{size,size}}のみ機能しn=2ます。

明確ではない可能性があるためboost::multi_array<char,n>(boost::extents[4][4][4])、4x4x4 配列を正しく初期化しますがn、ソースコードが変更されるたびに、すべての初期化を手動で更新する必要があるため、オプションではありません。

4

3 に答える 3

8

配列の作成をヘルパー関数にカプセル化できます。

template <typename T, size_t N>
boost::multi_array<T, N> make_regular_matrix(const size_t m)
{
    boost::multi_array<T, N> arr;
    boost::array<size_t, N> extents;
    extents.assign(m);
    arr.resize(extents);

    return arr;
}

const int n = 3;
int size = 4; // Can be const as well, but this is not mandatory

auto arr = make_regular_matrix<char, n>(size);

を使用できない場合はauto、テンプレートパラメータを複製する必要があります。

boost::multi_array<char, n> arr = make_regular_matrix<char, n>(size);

答えで行ったように、関数make_regular_matrixを短くして使用することができます。std::vectorこの実装がより良いかどうかはわかりません。ヘルパー関数の目的は、配列の作成を非表示にすることですが、他のバージョンを記述して、たとえば、指定された値で配列要素を初期化することもできます。

template <size_t N, typename T> //switched order for deduction
boost::multi_array<T, N> make_regular_matrix(const size_t m, const T & value)
{
     boost::multi_array<T, N> arr(std::vector<size_t>(n, m));

     std::fill(arr.data(), arr.data() + arr.num_elements(), value);

     return arr;
}

auto arr = make_regular_matrix<4>(3, 'z'); //creates a 3x3x3x3 matrix
                                           //filled with 'z's
于 2012-01-20T15:07:49.357 に答える
5

std::vectorn回繰り返される定数値を持つベクトルを構築するコンストラクターがあることが判明したため、可能な解決策は次のようになります。

const int n=2, size=4; //# of dimensions and size of one dimension
boost::multi_array<char,n> arr(std::vector<size_t>(n,size));

これにより、各次元のサイズが size に設定された n 次元の multi_array が初期化されます。

于 2012-01-15T17:39:09.620 に答える
3

Boost Multi-Arrayのドキュメントから、はい、1行で初期化できます。

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

typedefは読みやすさのためのものであり、あなたの例でも同じように簡単に行うことができます。

boost::multi_array<int, 2> arr(boost::extents[2][4]);
于 2012-01-11T18:22:28.067 に答える