我正在尝试使用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。
发布于 2013-05-12 15:39:43
RowOffset指定有多少条目的累积数量。它将始终从0开始,并以稀疏矩阵中包含的非零数结束。
RO ::0 2 3 3 4 5
因此,您应该将该行读作:在稀疏矩阵的第一行之前,有零个条目RO。在第一行中有两个条目RO1,这两个条目由CI-CI1索引,并用V-V1的值填充。在矩阵的第二行中,还有一个条目RO2 == 3,它位于CI2列,值为V2。
正如您所看到的,RO不会在表示矩阵中空行的第三个和第四个数字之间改变值。
希望这能澄清CSR矩阵格式的工作原理。否则,请随时提出更多要求。
https://stackoverflow.com/questions/16315727
复制相似问题