矩阵相乘C语言

C语言矩阵乘法实现

#include<stdio.h>
int main()
{
int count=0;
int a[3][4] = { { 2, 5, -8, 7 },{ 3, 8, 13, 2 }, { -6, 11, -2, 0 } };//3行四列
int b[4][2] = { { 22, 7 }, { -3, 16 }, { -9, 0 }, { 1, 8 } };
int c[3][2], i, j, k;//定义c数组为了用来储存a*b的结果,因为相乘的结果为3行2列(根据矩阵乘法)
for (i = 0; i < 3; i++){//第一个矩阵行数不超过3
for (j = 0; j < 2; j++){//第二个矩阵列数不超过2
c[i][j] = 0;//初始化存放结果的数组为0
for (k = 0; k < 4; k++)
c[i][j] += a[i][k] * b[k][j];//根据矩阵乘法,第一个矩阵的第i行第k列元素与第二个矩阵第j列的第k行元素对应相乘
}
}
for (i = 0; i < 3; i++)
{
    for (j = 0;j < 2; j++) {
printf("%-5d",  c[i][j]);//-5表示每5位一个结果,不满5位的数字用空格补上
count++;//用来计算结果元素数
}
if (count % 2 == 0)//每出现两个数组元素换行
{
printf("\n");
}
}

}

### 三元组矩阵相乘的C语言实现 在稀疏矩阵中,使用三元组表表示矩阵是一种常见的方法。三元组表通过记录非零元素的行、列值来节省存储空间。以下是一个用C语言实现三元组矩阵相乘的示例代码[^1]。 #### 示例代码:三元组矩阵相乘 ```c #include <stdio.h> #include <stdlib.h> typedef struct { int i; // 行号 int j; // 列号 int v; // 值 } Triple; typedef struct { int rows; int cols; int nums; Triple *data; } TSMatrix; // 创建三元组矩阵 TSMatrix *create_matrix(int rows, int cols, int nums) { TSMatrix *matrix = (TSMatrix *)malloc(sizeof(TSMatrix)); matrix->rows = rows; matrix->cols = cols; matrix->nums = nums; matrix->data = (Triple *)malloc(nums * sizeof(Triple)); return matrix; } // 销毁三元组矩阵 void destroy_matrix(TSMatrix *matrix) { free(matrix->data); free(matrix); } // 打印三元组矩阵 void print_matrix(TSMatrix *matrix) { for (int k = 0; k < matrix->nums; k++) { printf("(%d, %d, %d)\n", matrix->data[k].i, matrix->data[k].j, matrix->data[k].v); } } // 矩阵相乘 TSMatrix *multiply_matrix(TSMatrix *A, TSMatrix *B) { if (A->cols != B->rows) { printf("Error: Incompatible dimensions for multiplication.\n"); return NULL; } int C_rows = A->rows; int C_cols = B->cols; int max_nums = A->nums * B->nums; TSMatrix *C = create_matrix(C_rows, C_cols, 0); for (int p = 0; p < A->nums; p++) { int i = A->data[p].i; int u = A->data[p].j; int au = A->data[p].v; for (int q = 0; q < B->nums; q++) { if (B->data[q].i == u) { int j = B->data[q].j; int buj = B->data[q].v; int temp = au * buj; int flag = 0; for (int k = 0; k < C->nums; k++) { if (C->data[k].i == i && C->data[k].j == j) { C->data[k].v += temp; flag = 1; break; } } if (!flag) { if (C->nums >= max_nums) { printf("Error: Result matrix too large.\n"); return NULL; } C->data[C->nums].i = i; C->data[C->nums].j = j; C->data[C->nums].v = temp; C->nums++; } } } } return C; } int main() { // 创建矩阵A TSMatrix *A = create_matrix(2, 3, 3); A->data[0] = (Triple){0, 0, 1}; A->data[1] = (Triple){0, 2, 2}; A->data[2] = (Triple){1, 1, 3}; // 创建矩阵B TSMatrix *B = create_matrix(3, 2, 3); B->data[0] = (Triple){0, 0, 4}; B->data[1] = (Triple){1, 1, 5}; B->data[2] = (Triple){2, 0, 1}; // 矩阵相乘 TSMatrix *C = multiply_matrix(A, B); // 输出结果 printf("Result Matrix:\n"); print_matrix(C); // 销毁矩阵 destroy_matrix(A); destroy_matrix(B); destroy_matrix(C); return 0; } ``` 上述代码实现了三元组矩阵的创建、销毁、打印以及相乘操作。其中,`multiply_matrix` 函数负责计算两个三元组矩阵的乘积,并返回一个新的三元组矩阵[^2]。 #### 注意事项 - 在矩阵相乘时,需要确保第一个矩阵的列数与第二个矩阵的行数相等[^3]。 - 结果矩阵中的每个元素是通过遍历第一个矩阵的行第二个矩阵的列计算得出的。 - 如果结果矩阵中有重复的索引(即同一位置有多个非零元素),需要将这些元素的值相加。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值