2013-05-01 25 views
0

我正在尝试使用CUSP库。我正在阅读基本上稀疏的COO表示的.txt文件。我正在使用CUSP转换为CSR格式。无法理解CUSP中CSR表示的输出

当我用cusp::print()打印矩阵时,它会打印COO表示的正确结果。但是,当我将矩阵转换为CSR时,我写了自己的打印功能,但结果不是我想要的。

以下是摘录

 main() 
     { 
     //. 
     //bla bla 
     //.. 
     //create a 2d coo matrix 
    cusp::coo_matrix<int, int, cusp::host_memory> D(nRows_data, nCols_data, nnz_data); 

      // Load data from file into sparse matrices 
      //fill 2D coo matrix 
      fill2DCooMatrixFromFile(fNameData, D); 


      std::cout<<"\n----------------------------\n"; 
      cusp::print(D); 

      cusp::csr_matrix<int, int, cusp::host_memory> csrD = D; 
      std::cout<<"\n----------------------------\n"; 
      printCSRMatrix(csrD); 
     } 



     //print csr matrix 
     void printCSRMatrix(cusp::csr_matrix<int, int, cusp::host_memory> csr) 
     { 
      std::cout<<"csr matrix <"<<csr.num_rows<<", "<<csr.num_cols<<"> with <csr.num_entries<<" enteries\n"; 

      std::cout<<"V :: "; 
      for(int i=0 ; i<csr.values.size() ; i++) 
       std::cout<<csr.values[i]<<" "; 
      std::cout<<"\n"; 


      std::cout<<"CI :: "; 
      for(in 

t i=0 ; i<csr.column_indices.size() ; i++) 
      std::cout<<csr.column_indices[i]<<" "; 
     std::cout<<"\n"; 


     std::cout<<"RO :: "; 
     for(int i=0 ; i<csr.row_offsets.size() ; i++) 
      std::cout<<csr.row_offsets[i]<<" "; 
     std::cout<<"\n"; 

    } 

假设fill2DCooMatrixFromFile在下面的基质

1 0 1 0 0 
0 0 0 1 0 
0 0 0 0 0 
0 1 0 0 0 
0 0 0 1 0 

下面填充的输出我的代码

sparse matrix <5, 5> with 5 entries 
       0    0    1 
       0    2    1 
       1    3    1 
       3    1    1 
       4    3    1 

---------------------------- 
csr matrix <5, 5> with 5 enteries 
V :: 1 1 1 1 1 
CI :: 0 2 3 1 3 
RO :: 0 2 3 3 4 5 

让我不能了解输出的RowOffset。

回答

2

RowOffset指定累积有多少条目。它总是以0开始,并以稀疏矩阵中包含的非零数结束。

RO :: 0 2 3 3 4 5

因此,应该读取的行为:你的稀疏矩阵中的第一行之前,有非零项RO [0]。在第一行中有两个条目RO [1],这些条目由CI [0] -CI [1]索引并填充V [0] -V [1]的值。在矩阵的第二行中,还有一个条目RO [2] == 3,它位于列CI [2],值为V [2]。

正如你所看到的,RO不会改变表示矩阵中空行的第三个和第四个数字之间的值。

希望澄清CSR矩阵格式的工作原理。否则,请随时多问。