Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ uBlas稀疏矩阵非零元素上的循环_C++_Boost_Sparse Matrix_Ublas - Fatal编程技术网

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;
  }
}