实现矩阵的加法

试编写实现矩阵C = A + B操作的函数,其中矩阵A,B,C的行/列维数均为n。编写一个测试主函数,要求:存储矩阵元素的二维数组采用动态二维数组


题目分析:

实现矩阵的加法,so easy!!!
往后读着,血压渐渐升高,动态二维数组,我滴吗呀
在我们平常使用的数组一般都是静态的,数组不能变化的,定义成什么样子就是什么样子,而动态数组就不一样了,动态数组是利用指针,比如你定义了一个动态数组,当数组内存不够的时候,我们可以申请一块新的比原来大的内存空间,将数组名字指向这个新空间,这样就实现了数组内存变大。因此动态数组就不用担心内存空间不足。

考点:

1.动态数组的运用
2.矩阵的加法


代码实现:

#include<stdio.h>
#include<stdlib.h>
/*输入矩阵的数据元素,返回二维数组*/
int **intput(int **arr,int n)
{
    for (int i = 0; i < n; i++)
        arr[i] = (int *)calloc(n, sizeof(int)); //为二维数组中的多个一维数组分配内存空间
    printf("请输入%d个数作为矩阵的元素:\n", n*n);
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            scanf_s("%d", &arr[i][j]);
    return arr;
}
/*计算A+B,将B对应位置的数据加到A上,结果返回A*/
int **caculate(int **A, int **B,int n)
{
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            A[i][j] += B[i][j];
    return A;
}
/*输出矩阵*/
void output(int **arr,int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            printf("%3d ", arr[i][j]);
        printf("\n");
    }
}
int main()
{
    int n;
    printf("请输入矩阵的维数:");
    scanf_s("%d", &n);
    int **A = (int **)calloc(n, sizeof(int));  //A指向一个二维数组的空间,这个二维数组看成多个一维数组组成
    int **B = (int **)calloc(n, sizeof(int));
    int **C = (int **)calloc(n, sizeof(int));
    printf("\n\n创建矩阵A:\n\n");
    A = intput(A, n);
    printf("\n\n创建矩阵B:\n\n");
    B = intput(B, n);
    printf("\n\nA+B的结果C为:\n");
    C = caculate(A, B, n);
    output(C, n);           //输出结果矩阵
    system("pause");
    return 0;
}

运行结果:


测试一

img


测试二

img



代码编译器:Visual Studio 2017
ok,再见

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注:本题解使用了动态内存分配,需要在编译时加上参数“-std=c99” ```c #include <stdio.h> #include <stdlib.h> // 矩阵结构体 typedef struct { int row; int col; double **data; } Matrix; // 创建矩阵 Matrix createMatrix(int row, int col) { Matrix mat; mat.row = row; mat.col = col; mat.data = (double **)malloc(row * sizeof(double *)); for (int i = 0; i < row; i++) { mat.data[i] = (double *)malloc(col * sizeof(double)); } return mat; } // 释放矩阵 void freeMatrix(Matrix mat) { for (int i = 0; i < mat.row; i++) { free(mat.data[i]); } free(mat.data); } // 读取矩阵 void readMatrix(Matrix *mat) { for (int i = 0; i < mat->row; i++) { for (int j = 0; j < mat->col; j++) { scanf("%lf", &mat->data[i][j]); } } } // 打印矩阵 void printMatrix(Matrix mat) { for (int i = 0; i < mat.row; i++) { for (int j = 0; j < mat.col; j++) { printf("%.2lf ", mat.data[i][j]); } printf("\n"); } } // 矩阵加法 Matrix addMatrix(Matrix mat1, Matrix mat2) { Matrix mat = createMatrix(mat1.row, mat1.col); for (int i = 0; i < mat1.row; i++) { for (int j = 0; j < mat1.col; j++) { mat.data[i][j] = mat1.data[i][j] + mat2.data[i][j]; } } return mat; } // 矩阵乘法 Matrix mulMatrix(Matrix mat1, Matrix mat2) { Matrix mat = createMatrix(mat1.row, mat2.col); for (int i = 0; i < mat1.row; i++) { for (int j = 0; j < mat2.col; j++) { double sum = 0; for (int k = 0; k < mat1.col; k++) { sum += mat1.data[i][k] * mat2.data[k][j]; } mat.data[i][j] = sum; } } return mat; } // 矩阵转置 Matrix transpose(Matrix mat) { Matrix tm = createMatrix(mat.col, mat.row); for (int i = 0; i < mat.row; i++) { for (int j = 0; j < mat.col; j++) { tm.data[j][i] = mat.data[i][j]; } } return tm; } // 协方差矩阵 Matrix covMatrix(Matrix mat) { Matrix tm = transpose(mat); Matrix mean = createMatrix(1, mat.col); for (int i = 0; i < mat.col; i++) { mean.data[0][i] = 0; for (int j = 0; j < mat.row; j++) { mean.data[0][i] += mat.data[j][i]; } mean.data[0][i] /= mat.row; } Matrix cov = createMatrix(mat.col, mat.col); for (int i = 0; i < mat.col; i++) { for (int j = 0; j < mat.col; j++) { double sum = 0; for (int k = 0; k < mat.row; k++) { sum += (mat.data[k][i] - mean.data[0][i]) * (tm.data[j][k] - mean.data[0][j]); } cov.data[i][j] = sum / (mat.row - 1); } } freeMatrix(tm); freeMatrix(mean); return cov; } int main() { int m, n; printf("请输入矩阵1的数和数:"); scanf("%d %d", &m, &n); Matrix mat1 = createMatrix(m, n); printf("请输入矩阵1的元素:\n"); readMatrix(&mat1); printf("请输入矩阵2的数和数:"); scanf("%d %d", &m, &n); Matrix mat2 = createMatrix(m, n); printf("请输入矩阵2的元素:\n"); readMatrix(&mat2); printf("矩阵1的元素为:\n"); printMatrix(mat1); printf("矩阵2的元素为:\n"); printMatrix(mat2); Matrix mat = addMatrix(mat1, mat2); printf("矩阵1和矩阵2的和为:\n"); printMatrix(mat); freeMatrix(mat); mat = mulMatrix(mat1, mat2); printf("矩阵1和矩阵2的积为:\n"); printMatrix(mat); freeMatrix(mat); mat = transpose(mat1); printf("矩阵1的转置为:\n"); printMatrix(mat); freeMatrix(mat); mat = covMatrix(mat1); printf("矩阵1的协方差矩阵为:\n"); printMatrix(mat); freeMatrix(mat); freeMatrix(mat1); freeMatrix(mat2); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值