调整boost :: multi_array以匹配另一个

时间:2015-05-06 18:59:11

标签: c++ boost boost-multi-array

我需要将一个multi_array的大小调整为另一个的大小。

在Blitz ++中我可以做到

arr1.resize(arr2.shape());

是否有类似长度的multi_array解决方案?因为

arr1.resize(boost::extents[arr2.shape()[0]][arr2.shape()[1]]);

似乎有点长而且艰巨。

2 个答案:

答案 0 :(得分:0)

您可以使用_vimrc成员。遗憾的是,它无法直接作为shape()(它不会对ExtentList概念进行建模),但很容易将其合并为一个:

Collection

那样

using MA = multi_array<double, 2>;
MA ma(extents[12][34]);
auto& ma_shape = reinterpret_cast<boost::array<size_t, MA::dimensionality> const&>(*ma.shape());

打印// demo std::cout << "[" << ma_shape[0] << "][" << ma_shape[1] << "]\n";

现在,[12][34]可以直接用于重塑/调整另一个数组的大小:

<强> Live On Coliru

ma_shape

答案 1 :(得分:0)

我认为这是Boost.MultiArray的另一个疏忽。我写了一堆“实用程序”函数,它们允许采用形状(尺寸大小),基本索引(例如每个维度为0或1)和扩展(每个维度中的基本索引和大小)。

namespace boost{
template<class MultiArray>
detail::multi_array::extent_gen<MultiArray::dimensionality>
extension(MultiArray const& ma){ //this function is adapted from 
    typedef detail::multi_array::extent_gen<MultiArray::dimensionality> gen_type;
    gen_type ret;
    typedef typename gen_type::range range_type;
    for(int i=0; i != MultiArray::dimensionality; ++i)
        ret.ranges_[i] = range_type(ma.index_bases()[i], ma.index_bases()[i]+ma.shape()[i]);
    return ret;
}
}

以后用作:

boost::multi::array<double, 3> m(boost::multi::extents[3][4][5]);
boost::multi::array<double, 3> n(extension(m)); // n takes the extension (and shape) of m

(如果基本索引不为零,它也可以工作。它也适用于视图和其他multi_array类型。)