使用std :: partial_sum()对CSR进行COO

时间:2018-09-20 21:25:25

标签: c++

我想将矩阵从COO格式转换为CSR格式。我有一个解决方案,但使用std :: partial_sum可能会有更简单的方法,但是为了确保效率,我想将索引+1移位-参见以下详细信息:

// NxN矩阵示例

/*
index     0   1    2   3   4
        ______________________
     0  | 1   0  | 0   6   0 |
        |   A    |           |
     1  | 0   2  | 0   7   0 |
        |--------------------|
     2  | 0   0  | 3   0   8 |
        |        |   B       |
     3  | 10  11 | 0   4   9 |   
        |        |           |  
     4  | 0   0  |12  13   5 |
        ----------------------
*/

步骤1:计算每行非零元素的数量

结果:vec_rows = {2,2,2,4,3}

第2步:通过累计和创建CSR行指针

std::vector<int> row_ptr(n+1, 1);

int cumsum = 0;
for (int i=0; i<n; ++i)  
{
    int temp = vec_rows[i];
    row_ptr[i] = cumsum; 
    cumsum += temp;
}
row_ptr[n] = cumsum; 

结果:

row_ptr = {0,2,4,6,10,13}

它可以工作,但是用修改后的版本替换步骤2可能是一种更简单的方法:

std::partial_sum(vec_rows.begin(), vec_rows.end(), row_ptr.begin()); 
    r_ptr.insert(r_ptr.begin(),0); // insert 0 at index 0 and shift ALL elements = performance worst case

后者是性能最差的情况,由于实际矩阵会很大,我想知道是否有可能立即将元素加载到正确的位置, 输入0,后跟std::partial_sum(...)定义的元素?

0 个答案:

没有答案