Как мне получить представление о multi_array для буста и присвоить его тому же бустеру multi_array? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть функция 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.

Мне действительно нужен простой пример как я могу сделать одно из следующего:

  1. Использовать мою текущую стратегию создания array_view из моего исходного multi_array и присвоения нового представления обратно исходному массиву, ИЛИ
  2. Нарезка оригинального multi_array (на месте). Я искал пример этого решения и не могу найти его.

Спасибо.

1 Ответ

0 голосов
/ 14 апреля 2020

Это оказалось чем-то не связанным с моей программой. У меня были другие переменные, которые зависели от размеров моего массива (которые изменились из-за переназначения представления), которые мне не удалось установить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...