1

Boost ライブラリのバージョン 1.44.0 と c++ を gcc 4.0 で使用しています。

を作成ublas::compressed_matrix<double>し、メソッドを使用して入力しましたinsert_element(index1, index2, value)。その後、マトリックスの要素を繰り返し処理し、ゼロ以外の要素を出力しています。i1_t反復には次のコードを使用します (とi2_tはであることに注意してくださいtypedef boost::numeric::ublas::compressed_matrix<double>::iterator)。

   for (i1_t i1 = matrix->begin1(); i1 != matrix->end1(); i1++) {
    for (i2_t i2 = matrix->begin2(); i2 != matrix->end2(); i2++) {
     cout<<"("<<i2.index1()<<","<<i2.index2()<<")="<<*i2<<" ";
    }
    cout<<endl;
   }

または、次のようにします。

    for (i1_t i1 = matrix->begin1(); i1 != matrix->end1(); i1++) {
    cout<<i1.index1()<<" -> ";
    for (i2_t i2 = matrix->begin2(); i2 != matrix->end2(); i2++) {
     cout<<i2.index2()<<" ("<<*i2<<") ";
    }
    cout<<endl;
   }

もちろん、どちらもほとんど同じことをしています。コードは、stackoverflow の別の投稿で提供された提案に従います:ゼロ以外の要素の反復

ただし、コードを実行すると、次のエラーが発生するまで、最初のいくつかの要素のみが正しく出力されます (特に、これは最初の 6 つのエントリに適用されます)。

Check failed in file /opt/local/include/boost/numeric/ublas/matrix_sparse.hpp at line 3109:
p
terminate called after throwing an instance of 'boost::numeric::ublas::bad_index'
  what():  bad index

ただし、すべての要素がマトリックスに正しく挿入されているようです。何が起こっているのか、なぜこのエラーが発生するのか、それはどういう意味ですか?

どうもありがとう。

4

1 に答える 1

1

私は問題が何であるかを発見しました。もちろん、それは私のコードの間違いでした。

実際、内側のループ (つまり、2 番目の for ループ) は間違った処理を繰り返します。もともと私は書いた:

for (i2_t i2 = matrix->begin2(); i2 != matrix->end2(); i2++)

ただし、からまでi2繰り返してはなりません。代わりに、 の反復の制限はとである必要があります。 は最初の反復子です! 私の間違いをお詫び申し上げます。matrx->begin2()matrix->end2()i2i1.begin()i1.end()i1

したがって、要約すると、正しいループは次のようになります。

for (i1_t i1 = matrix->begin1(); i1 != matrix->end1(); i1++) {
   for (i2_t i2 = i1.begin(); i2 != i1.end(); i2++) {
      cout << "(" << i2.index1() << "," << i2.index2() << ")=" << *i2 << " ";
   }
   cout << endl;
}
于 2010-12-23T12:13:57.833 に答える