我想将矩阵从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(...)
定义的元素?