C语言矩阵加减法

更多矩阵运算可以参考我发的其他博客C语言矩阵运算,判断矩阵维数

目录

1.原理

2.函数编写(二维数组形式)

数组形式

指针形式

3.动态内存形式

开辟矩阵

优化后的矩阵加法


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语言判断矩阵维数中有详细讲解
  • 为结果矩阵开辟空间
  • 对应位相加减(计算方法与前文一致)

  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
矩阵加减乘法是常见的线性代数运算,在C语言中可以通过数组和循环实现。下面是简单的C语言代码示例: 矩阵加法: ```c #include <stdio.h> void matrix_add(int A[][3], int B[][3], int C[][3], int n) { int i, j; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { C[i][j] = A[i][j] + B[i][j]; } } } int main() { int A[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; int B[3][3] = {{9, 8, 7}, {6, 5, 4}, {3, 2, 1}}; int C[3][3]; int i, j; matrix_add(A, B, C, 3); printf("A + B = \n"); for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { printf("%d ", C[i][j]); } printf("\n"); } return 0; } ``` 矩阵减法: ```c #include <stdio.h> void matrix_sub(int A[][3], int B[][3], int C[][3], int n) { int i, j; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { C[i][j] = A[i][j] - B[i][j]; } } } int main() { int A[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; int B[3][3] = {{9, 8, 7}, {6, 5, 4}, {3, 2, 1}}; int C[3][3]; int i, j; matrix_sub(A, B, C, 3); printf("A - B = \n"); for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { printf("%d ", C[i][j]); } printf("\n"); } return 0; } ``` 矩阵乘法: ```c #include <stdio.h> void matrix_mul(int A[][3], int B[][3], int C[][3], int n) { int i, j, k; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { C[i][j] = 0; for (k = 0; k < n; k++) { C[i][j] += A[i][k] * B[k][j]; } } } } int main() { int A[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; int B[3][3] = {{9, 8, 7}, {6, 5, 4}, {3, 2, 1}}; int C[3][3]; int i, j; matrix_mul(A, B, C, 3); printf("A * B = \n"); for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { printf("%d ", C[i][j]); } printf("\n"); } return 0; } ``` 上述示例中的矩阵都是3x3的,可以根据实际情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是元笙阿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值