1

我正在使用 Boost 库,版本 1.44.0 和带有 gcc 4.0 的 c++。

我创建了一个ublas::compressed_matrix<double>并使用方法填充了它insert_element(index1, index2, value)。此后,我遍历矩阵的元素并打印出非零元素。我使用以下代码进行迭代(注意i1_tand i2_tare 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中另一篇文章提供的建议:迭代非零元素

但是,在运行代码时,我发现只有前几个元素被正确打印(特别是,这适用于前六个条目),直到出现以下错误:

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

我找到了问题所在,当然这是我在代码上的错误。

事实上,内部循环(即第二个 for 循环)迭代了错误的东西。最初我写道:

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

但是,不应该从toi2迭代。相反,迭代的限制应该是and ,第一个迭代器在哪里!为我的错误道歉。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 回答