更多矩阵运算可以参考我发的其他博客C语言矩阵运算,判断矩阵维数
目录
1.原理
矩阵加法需要满足的条件:两个相加的矩阵需要保持维度一致,即矩阵A+B,A的行、列=B的行、列。
加减法原理:矩阵加法的原理很简单,对应位置加减即可。
例如:
2.函数编写(二维数组形式)
因为加减法比较简单,所以只需要利用两个for循环遍历整个数组,将对应位想加减即可,这里用加法举例。
在函数开头需要利用assert断言条件是否成立,如果不成立系统会提示报错,assert需要包含头文件<assert.h>,如果不进行判断,传入错误的参数后,二维数组的访问会溢出。
因为数组传参传的是地址,所以函数的类型设置为void即可。
数组形式
//定义矩阵的行列
#define ROW1 3
#define COL1 3
#define ROW2 3
#define COL2 3
#include<stdio.h>
#include<assert.h>
//数组形式
void Matrix_addition(double arr1[][COL1], double arr2[][COL2], double arr3[][COL1],int row1, int col1,int row2,int col2)
{
assert(row1 == row2 && col1 == col2);//判断矩阵维数一致
int i = 0;
int j = 0;
for (i = 0; i < row1; i++)
{
for (j = 0; j < col1; j++)
{
arr3[i][j] = arr1[i][j] + arr2[i][j];
}
}
}
int main()
{
double arr1[ROW1][COL2] = {0};
double arr2[ROW1][COL2] = {9,8,7,6,5,4,3,2,1};
double arr3[ROW1][COL1] = { 0 };
Matrix_addition(arr1, arr2, arr3, ROW1, COL1,ROW2,COL2);
return 0;
}
指针形式
//定义矩阵的行列
#define ROW1 3
#define COL1 3
#define ROW2 3
#define COL2 3
#include<stdio.h>
#include<assert.h>
//指针形式
void Matrix_addition(double (*arr1)[COL1], double (*arr2)[COL2], double (*arr3)[COL1], int row1, int col1, int row2, int col2)
{
assert(row1 == row2 && col1 == col2);//判断矩阵维数一致
int i = 0;
int j = 0;
for (i = 0; i < row1; i++)
{
for (j = 0; j < col1; j++)
{
*(*(arr3 + i) + j) = *(*(arr1 + i) + j) + *(*(arr2 + i) + j);
}
}
}
int main()
{
double arr1[ROW1][COL2] = {0};
double arr2[ROW1][COL2] = {9,8,7,6,5,4,3,2,1};
double arr3[ROW1][COL1] = { 0 };
Matrix_addition(arr1, arr2, arr3, ROW1, COL1,ROW2,COL2);
return 0;
}
两种形式均可,本质上没有任何差别,根据自己喜好来使用即可。用define定义数组的行列,优点就是灵活,方便使用,后续只需要更改输入矩阵的相关参数即可进行运算。
3.动态内存形式
以二维数组进行运算时,总是要确定矩阵的维数,程序的可移植性差,推荐使用动态内存的形式开辟矩阵。
开辟矩阵
double** Make_Matrix(int row,int col)
{
int i, j;
double** arr = (double**)malloc(sizeof(double*) * row);
if (arr != NULL)
{
for (i = 0; i < row; i++)
{
arr[i] = (double*)malloc(sizeof(double) * col);
}
}
return arr;
}
这部分在C语言——malloc开辟矩阵 中进行了详细讲解,这里不再赘述。
优化后的矩阵加法
typedef double Mattype;//为了之后更改方便
Mattype** Matrix_Plus(Mattype** arr1, Mattype** arr2)
{
if(arr1==NULL||arr2==NULL)exit(-1);
//判断矩阵维数
int row1 = (int)_msize(arr1) / (int)sizeof(Mattype*);
int col1 = (int)_msize(*arr1) / (int)sizeof(Mattype);
int row2 = (int)_msize(arr2) / (int)sizeof(Mattype*);
int col2 = (int)_msize(*arr2) / (int)sizeof(Mattype);
if (row1 != row2||col1!=col2)
exit(-1);//判断左列是否等于右行
double** res = (Mattype**)malloc(sizeof(Mattype*) * row1);
if (res == NULL)
exit(-1);
int i, j;
for (i = 0; i < row1; i++)
{
res[i] = (Mattype*)malloc(sizeof(Mattype) * col1);//创建新矩阵
}
for (i = 0; i < row1; i++)
{
for (j = 0; j < col2; j++)
{
res[i][j] = 0.0;//开辟的新矩阵未初始化,计算前需要进行初始化
res[i][j] = arr1[i][j] + arr2[i][j];
}
}
return res;
}
上述代码中:
- 首先判断传入指针是否为空
- 然后判断矩阵的维数,这部分在C语言判断矩阵维数中有详细讲解
- 为结果矩阵开辟空间
- 对应位相加减(计算方法与前文一致)