稀疏矩阵转CSR格式存储
1.随机生成稀疏矩阵
#include<stdlib.h>
#include<assert.h>
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
void fill_random(float*data, int m, int n) {
srand((unsigned) (time(NULL))); //每次生成的随机数不一样
for (int i = 0; i < m*n; i++) {
data[i] = rand() % 100; //生成100以内的随机数
if (data[i] < 80) //made sparse
data[i] = 0;
}
}
void print_matrix(float*data, int m, int n) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int l = i + j * m;
cout << data[l] << " a";
}
cout << endl;
}
cout << endl;
}
void print_matrix(int*data, int m, int n) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int l = i + j * m;
cout << data[l] << " b";
}
cout << endl;
}
cout << endl;
}
void dense2csr(float*data, int*&rowPtr, int*&colInd, float*&val, int m, int n) {
rowPtr = (int*)malloc(sizeof(int)*(m + 1));
int* tcolInd = (int*)malloc(sizeof(int)*(m *n));
float* tval = (float*)malloc(sizeof(float)*(m *n));
int towtal = m * n;
int nnv = 0;
for (int i = 0; i < m; i++) {
rowPtr[i] = nnv;
for (int j = 0; j < n; j++) {
int l = i + j * m;
if (data[l] != 0) {
tcolInd[nnv] = j;
tval[nnv] = data[l];
nnv++;
}
}
}
rowPtr[m] = nnv;
colInd = (int*)malloc(sizeof(int)*(nnv));
val = (float*)malloc(sizeof(float)*(nnv));
memcpy(colInd, tcolInd, sizeof(float)*nnv);
memcpy(val, tval, sizeof(float)*nnv);
free(tcolInd);
free(tval);
}
void csr2dense(int*&rowPtr, int*&colInd, float*&val, float*&data, int m, int n) {
data = (float*)calloc(m*n,sizeof(float));
int nnv = rowPtr[m];
int* help = (int*)malloc(sizeof(int)*nnv); //indicates row index of element
for (int i = 0, l = 1; i < nnv; i++) {
while (i >= rowPtr[l])
l++;
help[i] = l-1;
}
for (int i = 0; i < nnv; i++) {
int datal = help[i] + colInd[i] * m;
data[datal] = val[i];
}
free(help);
}
bool same_matrix(float*A, float*B, int m, int n) {
for (int i = 0; i < m*n; i++) {
if (A[i] != B[i])
return false;
}
return true;
}
int main() {
int m = 5;
int n = 5;
float*A = (float*)malloc(sizeof(float)*m*n);
fill_random(A, m, n);
print_matrix(A, m, n);
int*csrRowPtr;
int*csrColInd;
float*csrVal;
dense2csr(A, csrRowPtr, csrColInd, csrVal, m, n);
print_matrix(csrRowPtr, 1, m+1);
print_matrix(csrColInd, 1, csrRowPtr[m]);
print_matrix(csrVal, 1, csrRowPtr[m]);
float*newA;
csr2dense(csrRowPtr, csrColInd, csrVal, newA, m, n);
print_matrix(newA, m, n);
assert(same_matrix(A, newA, m, n)); //debug mode
}