0

boost::numeric::ublas::compressed_matrix<std::complex<double>,boost::numeric::ublas::row_major,0,boost::numeric::ublas::unbounded_array<std::size_t>>介して対角部分を作成して抽出しboost::numeric::ublas::matrix_vector_rangeます。ソースは次のとおりです。

#include<boost/numeric/ublas/matrix_sparse.hpp>
#include<boost/numeric/ublas/matrix_proxy.hpp>
#include<boost/numeric/ublas/io.hpp>

int main()
{
   namespace ublas=boost::numeric::ublas;
   ublas::compressed_matrix<std::complex<double>,ublas::row_major,0,ublas::unbounded_array<std::size_t>>matrix(3,3);
   matrix.push_back(0,0,{1,1});
   matrix.push_back(0,1,{2,1});
   matrix.push_back(1,1,{3,1});
   matrix.push_back(2,2,{4,1});
   std::cout<<ublas::matrix_vector_range<decltype(matrix)>(matrix,ublas::basic_range<std::size_t>(0,matrix.size1()),ublas::basic_range<std::size_t>(0,matrix.size2()))<<std::endl;
}

そしてそれはうまくいきます。

次に、 FORTRAN 関数に を渡す必要がありcompressed_matrix、FORTRAN 関数では行インデックスと列インデックスが である必要があるためint、 に変更std::size_tintます。新しいソース コードは次のとおりです。

#include<boost/numeric/ublas/matrix_sparse.hpp>
#include<boost/numeric/ublas/matrix_proxy.hpp>
#include<boost/numeric/ublas/io.hpp>

int main()
{
  namespace ublas=boost::numeric::ublas;
  ublas::compressed_matrix<std::complex<double>,ublas::row_major,0,ublas::unbounded_array<int>>matrix(3,3);
  matrix.push_back(0,0,{1,1});
  matrix.push_back(0,1,{2,1});
  matrix.push_back(1,1,{3,1});
  matrix.push_back(2,2,{4,1});
  std::cout<<ublas::matrix_vector_range<decltype(matrix)>(matrix,ublas::basic_range<int>(0,matrix.size1()),ublas::basic_range<int>(0,matrix.size2()))<<std::endl;
}

その後g++ -std=c++11 -O2 -march=native -DNEBUG、ソース コードをコンパイルし、実行可能ファイル (gcc バージョン 4.9.1) を実行します。次のエラーが表示されます。

Check failed in file /usr/include/boost/numeric/ublas/storage.hpp at line 892:
start_ <= stop
terminate called after throwing an instance of 'boost::numeric::ublas::bad_index'
  what(): bad index
Aborted

次に、 /usr/ include /boost/numeric/ublas/storage.hppの 892 行目に移動すると、次のように表示されます。

BOOST_UBLAS_INLINE
    basic_range ():
        start_ (0), size_ (0) {}
    BOOST_UBLAS_INLINE
    basic_range (size_type start, size_type stop):
        start_ (start), size_ (stop - start) {
        BOOST_UBLAS_CHECK (start_ <= stop, bad_index ());
    }

しかし、私の場合start_は 未満ですstop。したがって、なぜそのようなエラーが表示されるのかわかりません。何が原因なのですか?

4

0 に答える 0