У меня есть функция DataView, которая выполняет «нарезку» (создание array_view) следующим образом:
template <class T>
typename Boost<T>::Array2D::template array_view<2>::type MyArray<T>::DataView(int x_start, int x_finish, int y_start, int y_finish)
{
using range = boost::multi_array_types::index_range;
return _Data[boost::indices[range().start(x_start).finish(x_finish).stride(1)][range().start(y_start).finish(y_finish).stride(1)]];
}
... где _Data - закрытый член типа Array2D (boost :: multi_array), содержащий часть данных MyArray. Разрезание (создание представления) происходит без проблем следующим образом:
Boost<double>::Array2D::array_view<2>::type array_view = my_array->DataView(x1, x2, y1, y2);
Проблема возникает, когда я хочу присвоить вновь полученное представление (array_view) обратно исходному multi_array ( my_array). Я попытался сделать это, создав эту функцию в классе MyArray:
template <class T>
void MyArray<T>::Data(const typename Boost<T>::Array2D &inData)
{
// find the dimensions of inData
int xdim = static_cast<int>(inData.shape()[0]);
int ydim = static_cast<int>(inData.shape()[1]);
// resize _Data to match the size of inData
_Data.resize(boost::extents[xdim][ydim]);
// assign _Data to the new set of data
_Data = inData;
}
... и вызвав функцию с этой строкой кода ...
my_array->Data(array_view);
Пока сборка прошла успешно, мое приложение выдает следующую ошибку:
base.hpp:178: Reference boost::detail::multi_array::value_accessor_one<T>::access(boost::type<Reference>, boost::detail::multi_array::value_accessor_one<T>::index, TPtr, const size_type*, const index*, const index*) const [with Reference = double&; TPtr = double*; T = double; boost::detail::multi_array::value_accessor_one<T>::index = long int; boost::detail::multi_array::multi_array_base::size_type = long unsigned int]: Assertion `size_type(idx - index_bases[0]) < extents[0]' failed.
Мне действительно нужен простой пример как я могу сделать одно из следующего:
- Использовать мою текущую стратегию создания array_view из моего исходного multi_array и присвоения нового представления обратно исходному массиву, ИЛИ
- Нарезка оригинального multi_array (на месте). Я искал пример этого решения и не могу найти его.
Спасибо.