遍历uBlas稀疏矩阵中非零元素

7
我有一个包含 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个回答

16
你可以在这个常见问题解答中找到答案:如何遍历所有非零元素? 在你的情况下,应该是这样的:
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;
  }
}

重要提示,我忘记添加了:您选择的压缩矩阵存储组织类型很重要,因为它决定了迭代压缩矩阵的最快方式。如果您选择行主存储类型,则上面的示例是迭代最快的方式。如果您选择列主存储类型,则必须交换内部和外部循环,即首先循环列将是最快的方式。 - Gert
boost将根据存储表示(行主或列主)进行迭代。因此,相同的循环将适用于任何表示。无需进行更改。 - user236215
2
抱歉顶起了一篇旧帖子。我不确定这段代码是否有效,请参见http://lists.boost.org/MailArchives/ublas/2006/11/1516.php。根据我的经验,它将遍历每个元素。 - Mikhail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接