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);

所以我有 4 行代码来获取 MultiArray,但我想在一行中完成。是否有任何简单的方法来生成具有 n 维的 MultiArray,每个维度都有size长度(所以我可以写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::vector有一个构造函数,它构造一个具有重复 n 次的常数值的向量,因此可能的解决方案如下所示:

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));

这会初始化一个 n 维 multi_array,每个维度的大小都设置为 size。

于 2012-01-15T17:39:09.620 回答
3

Boost Multi-Array 文档中,是的,您可以将其初始化一行:

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

typedefs 是为了便于阅读,你可以很容易地为你的例子做:

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