在c ++中将COO转换为CSR格式

时间:2014-05-10 17:05:15

标签: c sparse-matrix intel-mkl

我有一个COO格式的矩阵。更具体地说,有三个矩阵row_indexcolumn_indexvalue。您是否可以帮助我使用C语言以高效而非计算成本的方式在CSR format中转换此矩阵格式?是否有用于此目的的图书馆?

示例:

enter image description here

首席运营官格式:

       row_index col_index value
          1         1         1
          1         2        -1
          1         3        -3   
          2         1        -2
          2         2         5
          3         3         4
          3         4         6
          3         5         4
          4         1        -4
          4         3         2
          4         4         7     
          5         2         8
          5         5        -5 

3 个答案:

答案 0 :(得分:1)

Intel MKL documentation(对于mkl_csrcoo)声明:

  

将CSR格式的稀疏矩阵转换为坐标格式   和 反之亦然

根据以上链接,您应该设置job

if job(1)=1, the matrix in the coordinate format is converted to the CSR format.

答案 1 :(得分:1)

我知道这是一个旧线程,但是假设COO数据是(i,j)有序/已排序,如您所示,从COO转换为CSR的顺序算法是:< / p>

int main()
{
    // Example from Wikipedia (https://en.wikipedia.org/wiki/Sparse_matrix)

    // Matrix:
    // 10 20  0  0  0  0
    //  0 30  0 40  0  0
    //  0  0 50 60 70  0
    //  0  0  0  0  0 80

    // Expected output:
    // csr_val: 10 20 30 40 50 60 70 80
    // csr_col:  0  1  1  3  2  3  4  5
    // csr_row:  0  2  4  7  8

    const int  nnz = 8; // number of non-zero elements
    const int rows = 4; // number of matrix rows
    const int cols = 6; // number of matrix columns

    // coo data:
    double coo_val[nnz] = { 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0 };
    int    coo_row[nnz] = { 0, 0, 1, 1, 2, 2, 2, 3 };
    int    coo_col[nnz] = { 0, 1, 1, 3, 2, 3, 4, 5 };

    // coo to csr:
    double csr_val[nnz]      = { 0 };
    int    csr_col[nnz]      = { 0 };
    int    csr_row[rows + 1] = { 0 };
    for (int i = 0; i < nnz; i++)
    {
        csr_val[i] = coo_val[i];
        csr_col[i] = coo_col[i];
        csr_row[coo_row[i] + 1]++;
    }
    for (int i = 0; i < rows; i++)
    {
        csr_row[i + 1] += csr_row[i];
    }
}

请注意,假设COO数据是按(i,j)排序/排序的csr_col = coo_colcsr_val = coo_val,因此您只需要获取csr_row ,这很简单:

int csr_row[rows + 1] = { 0 };
for (int i = 0; i < nnz; i++)
    csr_row[coo_row[i] + 1]++;
for (int i = 0; i < rows; i++)
    csr_row[i + 1] += csr_row[i];

因此,总而言之,您可以使用上面介绍的5行代码轻松实现所需的功能。

最终备注:

建议的方法不考虑重复的COO条目。

答案 2 :(得分:0)

此转换的实现包含在scipy(开源:BSD许可)中,特别是function coo_tocsr。它是在C ++中,但这只是为了模拟数据和索引类型,并且为了初始化数据结构,所以它可以很容易地转换成C代码。