为什么在迭代稀疏矩阵的元素时会出现numeric :: ublas :: bad_index错误?

我正在使用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中另一篇文章提供的建议:迭代非零元素 但是,在运行代码时,我得到的只是正确打印的前几个元素(特别是,这适用于前六个条目),直到我收到以下错误:
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
但是,所有元素似乎都正确地插入到矩阵中。 我想知道发生了什么,为什么我得到这个错误,这是什么意思? 非常感谢。     
已邀请:
我发现了问题所在,当然这是我在代码上的错误。 实际上,内循环(即第二个for循环)遍历错误的东西。最初我写道:
for (i2_t i2 = matrix->begin2(); i2 != matrix->end2(); i2++)
但是,
i2
不应该从
matrx->begin2()
迭代到
matrix->end2()
。相反,
i2
的迭代限制应为
i1.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;
}
    

要回复问题请先登录注册