写一个c语言程序, 已知两个矩阵M, N,求两个矩阵的乘积,使用改进的三元组顺序表实现。题中所用到的两个矩阵是以三元组表形式键入的。
时间: 2024-10-24 10:15:34 浏览: 42
在C语言中,我们可以使用结构体来表示矩阵的三元组,并创建一个函数来计算它们的乘积。首先,我们定义一个结构体存储矩阵的元素和行数、列数,然后设计一个三元组顺序表结构来存储矩阵。
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int row;
int col;
double value;
} MatrixTriple;
typedef struct {
MatrixTriple* data;
int size;
int capacity;
} Matrix;
// 动态分配内存并初始化矩阵
Matrix* create_matrix(int rows, int cols) {
Matrix* mat = (Matrix*)malloc(sizeof(Matrix));
mat->data = (MatrixTriple*)malloc(rows * cols * sizeof(MatrixTriple));
mat->size = 0;
mat->capacity = rows * cols;
return mat;
}
// 矩阵乘法的核心部分,处理三元组乘法
void multiply_triples(MatrixTriple m1, MatrixTriple m2, MatrixTriple result) {
result.value = m1.value * m2.value;
}
// 计算两个矩阵的乘积
void matrix_multiply(Matrix* mat1, Matrix* mat2) {
if (mat1->col != mat2->row) {
printf("Error: Matrices cannot be multiplied due to incompatible dimensions.\n");
return;
}
MatrixTriple* temp = (MatrixTriple*)malloc(mat1->row * mat2->col * sizeof(MatrixTriple));
int i, j, k;
for (i = 0; i < mat1->row; ++i) {
for (j = 0; j < mat2->col; ++j) {
result.value = 0.0;
for (k = 0; k < mat1->col; ++k) {
multiply_triples(mat1->data[i * mat1->col + k], mat2->data[k * mat2->row + j], result);
temp[i * mat2->col + j].value += result.value;
}
mat1->data[i * mat2->col + j] = temp[i * mat2->col + j];
}
}
free(temp);
}
int main() {
// 示例矩阵
Matrix* M = create_matrix(3, 2); // 输入矩阵M
Matrix* N = create_matrix(2, 4); // 输入矩阵N
// ... 填充矩阵数据 ...
matrix_multiply(M, N);
// 打印结果矩阵
for (int i = 0; i < M->row; ++i) {
for (int j = 0; j < M->col; ++j) {
printf("%.2f ", M->data[i * M->col + j].value);
}
printf("\n");
}
// 清理内存
free(M->data);
free(M);
free(N->data);
free(N);
return 0;
}
```
在这个示例中,`matrix_multiply`函数实现了两个矩阵的乘法操作,前提是第一个矩阵的列数等于第二个矩阵的行数。矩阵元素是作为三元组存储的,你可以按照需要填充矩阵的数据。
阅读全文