изменение размера boost :: multi_array для соответствия другому

Мне нужно изменить размер одного multi_array до размера другого.

В Blitz ++ я мог просто сделать

arr1.resize(arr2.shape());

Есть ли решение multi_array аналогичной длины? Так как

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

кажется немного длинным и трудным.

2

Решение

Вы можете использовать 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],

Сейчас, ma_shape может напрямую использоваться для изменения формы или изменения размера другого массива:

Жить на Колиру

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

int main() {
using namespace boost;
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";

// resize
MA other;
assert(!std::equal(ma_shape.begin(), ma_shape.end(), other.shape()));

other.resize(ma_shape);
assert(std::equal(ma_shape.begin(), ma_shape.end(), other.shape()));

// reshape
other.resize(extents[1][12*34]);
assert(!std::equal(ma_shape.begin(), ma_shape.end(), other.shape()));

other.reshape(ma_shape);
assert(std::equal(ma_shape.begin(), ma_shape.end(), other.shape()));
}
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.)

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector