循环uBlas稀疏矩阵的非零元素

时间:2009-11-25 09:18:52

标签: c++ boost sparse-matrix ublas

我有以下稀疏矩阵,其中包含O(N)个元素

boost::numeric::ublas::compressed_matrix<int> adjacency (N, N);

我可以编写一个暴力双循环来遍历O(N^2)时间内的所有条目,如下所示,但这太慢了。

for(int i=0; i<N; ++i)
   for(int j=0; j<N; ++j)
       std::cout << adjacency(i,j) std::endl;

如何在O(N)时间内仅循环非零条目?对于每个非零元素,我希望能够访问其值,以及索引i,j

1 个答案:

答案 0 :(得分:15)

您可以在此常见问题解答中找到答案:How to iterate over all non zero elements?

在你的情况下,它将是:

typedef boost::numeric::ublas::compressed_matrix<int>::iterator1 it1_t;
typedef boost::numeric::ublas::compressed_matrix<int>::iterator2 it2_t;

for (it1_t it1 = adjacency.begin1(); it1 != adjacency.end1(); it1++)
{
  for (it2_t it2 = it1.begin(); it2 != it1.end(); it2++)
  {
    std::cout << "(" << it2.index1() << "," << it2.index2() << ") = ";
    std::cout << *it2 << std::endl;
  }
}