矩阵乘法的c语言实现(malloc)

矩阵乘法

关键词 动态内存管理

编译器 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");
}

运行结果

在这里插入图片描述

收工,结束快乐的一天

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值