用C语言写一个压缩稀疏矩阵的代码
时间: 2023-06-14 10:07:15 浏览: 106
C 代码 从稀疏三元组 (ST) 格式转换矩阵 转换为压缩列存储 (CCS) 格式.rar
下面是一个简单的压缩稀疏矩阵的代码,采用的是COO格式:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int row;
int col;
int val;
} Element;
typedef struct {
int row;
int col;
int count;
Element *elements;
} SparseMatrix;
SparseMatrix *createSparseMatrix(int row, int col, int count) {
SparseMatrix *matrix = (SparseMatrix*)malloc(sizeof(SparseMatrix));
matrix->row = row;
matrix->col = col;
matrix->count = count;
matrix->elements = (Element*)malloc(count * sizeof(Element));
return matrix;
}
void destroySparseMatrix(SparseMatrix *matrix) {
free(matrix->elements);
free(matrix);
}
void printSparseMatrix(SparseMatrix *matrix) {
int i, j, k;
k = 0;
for (i = 0; i < matrix->row; i++) {
for (j = 0; j < matrix->col; j++) {
if (k < matrix->count && matrix->elements[k].row == i && matrix->elements[k].col == j) {
printf("%d ", matrix->elements[k].val);
k++;
} else {
printf("0 ");
}
}
printf("\n");
}
}
SparseMatrix *compressSparseMatrix(int **a, int row, int col) {
int i, j, k, count;
for (i = 0, count = 0; i < row; i++) {
for (j = 0; j < col; j++) {
if (a[i][j] != 0) {
count++;
}
}
}
SparseMatrix *matrix = createSparseMatrix(row, col, count);
for (i = 0, k = 0; i < row; i++) {
for (j = 0; j < col; j++) {
if (a[i][j] != 0) {
matrix->elements[k].row = i;
matrix->elements[k].col = j;
matrix->elements[k].val = a[i][j];
k++;
}
}
}
return matrix;
}
int main() {
int a[3][4] = {
{1, 0, 0, 0},
{0, 0, 2, 0},
{0, 3, 0, 4}
};
SparseMatrix *matrix = compressSparseMatrix((int**)a, 3, 4);
printSparseMatrix(matrix);
destroySparseMatrix(matrix);
return 0;
}
```
代码中定义了两个结构体,一个是表示稀疏矩阵中的元素,另一个是表示整个稀疏矩阵。`createSparseMatrix`函数用于创建一个稀疏矩阵,`destroySparseMatrix`函数用于销毁一个稀疏矩阵,`printSparseMatrix`函数用于打印一个稀疏矩阵。`compressSparseMatrix`函数用于将一个普通矩阵压缩成稀疏矩阵。函数中遍历矩阵,如果某个元素不为零,则将其作为一个稀疏矩阵元素存入稀疏矩阵的元素数组中。最后,程序通过调用`compressSparseMatrix`函数将一个普通矩阵转换成稀疏矩阵,并通过调用`printSparseMatrix`函数打印出来。
阅读全文