2013-05-01 65 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矩陣格式的工作原理。否則,請隨時多問。