Почему я получаю ошибку numeric :: ublas :: bad_index при итерации элементов разреженной матрицы? - PullRequest
1 голос
/ 22 декабря 2010

Я использую библиотеку 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

Однако все элементы, похоже, правильно вставлены в матрицу.Мне интересно, что происходит, почему я получаю эту ошибку и что она означает?

Большое спасибо.

1 Ответ

1 голос
/ 23 декабря 2010

Я нашел, в чем проблема, и, конечно, это была моя ошибка в коде.

На самом деле внутренний цикл (то есть второй цикл 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;
}
...