矩阵乘法
关键词 动态内存管理
编译器 mingw32-gcc/gcc5.1.0
重拾代码乐趣
很久没有写c了,主要是c写起来太啰嗦了,但如果能学会,还是很有快乐的
撸代码
#include <stdio.h>
#include <stdlib.h>
int main() {
int matrixMultipliation();
matrixMultipliation();
return 0;
}
int matrixMultipliation() {
int printMatrix(int, int, int*);
int* calculate(int,int,int*,int,int,int*);
int a_row;
int a_col;
int b_row;
int b_col;
//依次输入矩阵的维度
printf("Enter the dimensions of the matrix in order,a_row,a_column,b_row,b_column:\n");
scanf("%d",&a_row);
scanf("%d",&a_col);
scanf("%d",&b_row);
scanf("%d",&b_col);
if(a_col!=b_row) {
printf("math error!");
return 0;
}
//矩阵A,B
int* a;
int* b;
//矩阵A,B的元素个数
int a_len = a_row*a_col;
int b_len = b_row*b_col;
//初始化矩阵A
a = (int*)malloc(a_len*sizeof(int));
printf("please continue typing %d*%d numbers for A matrix in rows:\n", a_row, a_col);
int i;
int* p = a;
for(i=0; i<a_len; i++) {
scanf("%d",p++);
printf("%d ",*(p-1));
}
printf("is your enter. as follow:\n\n");
printMatrix(a_row,a_col,a);
printf("\n");
//初始化矩阵B
b=(int *)malloc((b_row*b_col)*sizeof(int));
printf("please continue typing %d*%d numbers for B matrix in rows:\n", b_row,b_col);
p=b;
for(i=0; i<b_len; i++) {
scanf("%d",p++);
printf("%d ",*(p-1));
}
printf("is your enter.as follow:\n\n");
printMatrix(b_row,b_col,b);
printf("\n");
//计算
int* res = calculate(a_row,a_col,a,b_row,b_col,b);
//打印
printf("the answer is:\n");
printMatrix(a_row,b_col, res);
//释放内存
free(a);
free(b);
free(res);
return 0;
}
int* calculate(int a_row, int a_col, int *a, int b_row,int b_col, int *b) {
int *res = (int*)malloc((a_row*b_col)*sizeof(int));
//遍历结果矩阵res
int row,col;
for(row=0; row<a_row; row++) {
for(col=0; col<b_col; col++) {
//res[row][col]
//对每一个元素求和
int k;
*(res+row*b_col+col) = 0;//malloc没有清0
for(k=0; k<a_col; k++) {
//打印计算过程,从res[1][1]开始
printf("--------operation-------\n");
printf("a[%d][%d] is %d\n",row+1,k+1,*(a+row*a_col+k));
printf("b[%d][%d] is %d\n",k+1,col+1,*(b+k*b_col+col));
printf("index:%d\n",row*b_col+col);
//res[row][col] = SUM(a[row][k]*b[k][col])(k=1,2...)
*(res+row*b_col+col) += *(a+row*a_col+k) *( *(b+k*b_col+col));
}
printf("res[%d][%d] is %d\n",row+1,col+1,*(res+row*b_col+col));
printf("--------operation-------\n\n");
}
}
return res;
}
int printMatrix(int m_row, int m_col, int *m) {
int* p = m;
int len = m_row * m_col;
printf("-----matrix-----\n");
for(int i=0; i<len&&NULL!=p; i++) {
if(i%m_col==0&&i!=0) {
printf("\n");
}
printf("%d\t",*p);
++p;
}
printf("\n-----matrix-----\n");
}
运行结果
收工,结束快乐的一天