帮我写一个稀疏矩阵乘法的代码c语言实现
时间: 2024-05-02 21:22:19 浏览: 142
以下是一个简单的稀疏矩阵乘法的C语言实现:
```
#include <stdio.h>
#define ROWS 3
#define COLS 3
// 稀疏矩阵结构体
typedef struct {
int row;
int col;
int value;
} SparseMatrix;
// 矩阵乘法函数
SparseMatrix* matrix_multiply(SparseMatrix* a, SparseMatrix* b) {
// 判断两个矩阵是否可以相乘
if (a[0].col != b[0].row) {
printf("Error: Can't multiply matrices.\n");
return NULL;
}
// 定义结果矩阵
SparseMatrix* result = (SparseMatrix*)malloc(sizeof(SparseMatrix));
result[0].row = a[0].row;
result[0].col = b[0].col;
result[0].value = 0;
// 定义中间矩阵
int temp[COLS] = {0};
// 遍历稀疏矩阵A
for (int i = 1; i <= a[0].value; i++) {
int row = a[i].row;
int col = a[i].col;
int val = a[i].value;
// 清空中间矩阵
for (int j = 0; j < COLS; j++) {
temp[j] = 0;
}
// 遍历稀疏矩阵B的当前列
for (int j = 1; j <= b[0].value; j++) {
if (b[j].col == col) {
temp[b[j].row] = b[j].value;
}
}
// 计算结果矩阵的当前元素
for (int j = 0; j < COLS; j++) {
result[0].value++;
result[result[0].value].row = row;
result[result[0].value].col = j;
result[result[0].value].value += val * temp[j];
}
}
return result;
}
int main() {
// 定义稀疏矩阵A
SparseMatrix A[ROWS*COLS+1] = {
{ROWS, COLS, 4},
{0, 0, 1},
{0, 1, 2},
{1, 0, 3},
{2, 2, 4}
};
// 定义稀疏矩阵B
SparseMatrix B[ROWS*COLS+1] = {
{COLS, ROWS, 3},
{0, 0, 1},
{0, 2, 2},
{2, 1, 3}
};
// 计算稀疏矩阵A和B的乘积
SparseMatrix* C = matrix_multiply(A, B);
// 输出结果矩阵
printf("Result Matrix:\n");
for (int i = 1; i <= C[0].value; i++) {
printf("%d %d %d\n", C[i].row, C[i].col, C[i].value);
}
return 0;
}
```
该代码中,我们先定义了一个稀疏矩阵结构体 `SparseMatrix`,包含矩阵的行、列和值。然后,我们定义了一个矩阵乘法函数 `matrix_multiply`,该函数接受两个稀疏矩阵作为参数,并返回它们的乘积。
在 `matrix_multiply` 函数内部,我们首先判断两个矩阵是否可以相乘。然后,我们定义结果矩阵和中间矩阵。接着,我们遍历稀疏矩阵 A,对于 A 的每个元素,我们清空中间矩阵,然后遍历稀疏矩阵 B 的当前列,将中间矩阵的对应位置赋值为 B 的当前元素的值。最后,我们计算结果矩阵的当前元素,将其添加到结果矩阵中。
在主函数中,我们定义了两个稀疏矩阵 A 和 B,并调用 `matrix_multiply` 函数计算它们的乘积。最后,我们输出结果矩阵。
阅读全文