0

我正在尝试使用 CUSP 库。我正在阅读 .txt 文件,这些文件基本上是稀疏的 COO 表示。我正在使用 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。

4

1 回答 1

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 矩阵格式的工作原理。否则,请随时询问更多。

于 2013-05-12T07:39:42.773 回答