C++ uBlas稀疏矩阵非零元素上的循环
我有下面的稀疏矩阵,它包含C++ uBlas稀疏矩阵非零元素上的循环,c++,boost,sparse-matrix,ublas,C++,Boost,Sparse Matrix,Ublas,我有下面的稀疏矩阵,它包含O(N)元素 boost::numeric::ublas::compressed_matrix<int> adjacency (N, N); 如何在O(N)时间中仅循环非零项?对于每个非零元素,我希望能够访问其值以及索引I,j,您可以在本常见问题解答中找到答案: 在您的情况下,它将是: typedef boost::numeric::ublas::compressed_matrix<int>::iterator1 it1_t; typedef
O(N)
元素
boost::numeric::ublas::compressed_matrix<int> adjacency (N, N);
如何在
O(N)
时间中仅循环非零项?对于每个非零元素,我希望能够访问其值以及索引I,j
,您可以在本常见问题解答中找到答案:
在您的情况下,它将是:
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;
}
}
typedef boost::numeric::ublas::compressed_matrix::iterator1 it1_t;
typedef boost::numeric::ublas::compressed_matrix::iterator 2 it2_t;
for(it1_t it1=adjacenty.begin1();it1!=adjacenty.end1();it1++)
{
for(it2_t it2=it1.begin();it2!=it1.end();it2++)
{
std::cout我忘记添加的重要注意事项:您为压缩矩阵选择的存储组织类型很重要,因为它决定了迭代压缩矩阵的最快方式。如果您将row_major作为存储类型,我上面的示例是迭代的最快方式。如果您选择column_major,则必须进行交换内部和外部循环(即首先在列上循环)将是最快的。boost将根据存储表示(行主循环或列主循环)进行迭代。因此,上述相同的循环将适用于任何一种表示。无需进行任何更改。很抱歉,打断了一篇旧文章。我不确定此代码是否确实有效。请参见。根据我的经验,它将迭代每个元素。
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;
}
}