0

次のように「スライス」(array_view の作成) を実行する DataView という関数があります。


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 は、MyArray のデータ部分を含む Array2D (boost::multi_array) 型のプライベート メンバーです。次のように、スライス (ビューの作成) は問題なく行われています。


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. 元の multi_array から array_view を作成し、新しいビューを元の配列に割り当てるという現在の戦略を使用する、または
  2. 元の multi_array を (その場で) スライスします。このソリューションの例を探しましたが、見つからないようです。

ありがとうございました。

4

1 に答える 1

0

これは、私のプログラムでは無関係であることが判明しました。設定に失敗した配列 (ビューへの再割り当てにより変更された) の次元に依存する他の変数がありました。

于 2020-04-13T22:59:18.620 に答える