稀疏矩阵的压缩存储的完整代码C语言的可运行代码
时间: 2024-11-17 11:28:27 浏览: 1
C语言实现高性能sparse_gemv稀疏矩阵积分算法库代码
5星 · 资源好评率100%
在C语言中,稀疏矩阵的压缩存储通常采用三元组(row, column, value)的形式,因为大部分稀疏矩阵只有少数非零元素。这里是一个简单的单向链表表示稀疏矩阵的压缩存储的示例:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int row;
int col;
double value;
} SparseEntry;
typedef struct {
SparseEntry* entries; // 非零元素列表
int num_entries; // 非零元素个数
int max_rows; // 最大行数
int max_cols; // 最大列数
} SparseMatrix;
// 创建一个新的稀疏矩阵
SparseMatrix* createSparseMatrix(int rows, int cols) {
SparseMatrix* matrix = (SparseMatrix*)malloc(sizeof(SparseMatrix));
matrix->entries = NULL;
matrix->num_entries = 0;
matrix->max_rows = rows;
matrix->max_cols = cols;
return matrix;
}
// 添加一个非零元素到矩阵
void addElement(SparseMatrix* matrix, int row, int col, double value) {
if (matrix->num_entries >= matrix->max_rows * matrix->max_cols) {
expand(matrix);
}
SparseEntry* entry = (SparseEntry*)malloc(sizeof(SparseEntry));
entry->row = row;
entry->col = col;
entry->value = value;
entry->next = matrix->entries;
matrix->entries = entry;
matrix->num_entries++;
}
// 扩展矩阵容量
void expand(SparseMatrix* matrix) {
matrix->entries = (SparseEntry**)realloc(matrix->entries, sizeof(SparseEntry*) * (matrix->num_entries * 2 + 1));
matrix->max_rows *= 2;
matrix->max_cols *= 2;
}
// 输出矩阵
void printSparseMatrix(const SparseMatrix* matrix) {
for (SparseEntry* entry = matrix->entries; entry != NULL; entry = entry->next) {
printf("(%d,%d): %.2lf ", entry->row, entry->col, entry->value);
}
printf("\n");
}
int main() {
SparseMatrix* matrix = createSparseMatrix(5, 5); // 示例一个5x5矩阵
// 添加一些非零元素
addElement(matrix, 0, 0, 1.0);
addElement(matrix, 1, 2, 2.5);
addElement(matrix, 4, 4, 4.0);
printSparseMatrix(matrix);
free(matrix->entries);
free(matrix);
return 0;
}
```
这个代码创建了一个稀疏矩阵结构,并提供了一些基本操作,如添加元素和打印矩阵。请注意,这只是一个非常基础的实现,实际应用中可能需要更复杂的数据结构和功能,比如删除元素、查找等。
阅读全文