稀疏矩阵 CSR
CSR
CSR是稀疏矩阵的一种存储方式,这里举例说明一下CSR的工作原理。
0 0 0 0
5 8 0 0
0 0 3 0
0 6 0 0
上述矩阵的CSR存储结果
row_index = [0 0 2 3 4]
col_index = [0 1 2 1]
val = [5 8 3 6]
row_index用来索引行。如果采用行数的方式来索引,那么在一行具有很多非零元素时,很浪费空间。因此,row_index采用偏移的方式,以0开始,第i+1元素 = 第i元素 +矩阵第i行非零元素数目
。
col_index即表示元素所在的列,val是矩阵中该位置存储的真实值。
下面给出上面row_index的推导过程:
我们有, i = 0, row_index[0] = 0
则 i = 1, row_index[1] = row_index[0] + num[0] =0 (num[i] = 矩阵第i行非零元素数目)
按同样方式即可完成推导。
Code
下面给出用矩阵相乘的代码,矩阵存储结构为CSR
void mul(csr *m, int *x ,int *y){//y为结果,已初始化为0
for(int i = 0; i < m->n; i++){
for(int j = 0; j < (m->row_index[i+1] - m->row_index[i]); j++){
y[i] = m->val[m->row_index[i] + j] * x[m->col_index[i]] + y[i];
}
}
}