关于《矩阵的种种》

通过学习线性代数我们更为深刻地认识了矩阵,那么当矩阵遇上了编程会有什么样的化学反应呢?

本篇将介绍有关矩阵的几种简单编程类型。

一,输入输出矩阵

(1)输入:如果想要输入一个m*n型的矩阵,我们首先要定义一个二维矩阵a[m][n],那么根据输入习惯,一行一行依次输入矩阵中的元素,这样又涉及到了循环。

#include<stdio.h>
#define ROW 8
#define COL 8
int a[ROW][COL];//假定一个矩阵(二维数组)为8*8型
int main() {
	int m, n;
	scanf("%d%d", &m, &n);//输入m*n型
	for (int i = 0; i < m; i++)
		for (int j = 0; j < n; j++)//双重循环是为了一行一行依次输入
			scanf("%d", &a[i][j]);
}

(2)输出:直接用printf语句输出二维数组我们会发现,输出结果并不是我们想要的矩阵形式。

那么在想要输出矩阵形式时,我们需要在列数完成时换行。

#include<stdio.h>
#define ROW 8
#define COL 8
int a[ROW][COL];//假定一个矩阵(二维数组)为8*8型
int main() {
	int m, n;
	scanf("%d%d", &m, &n);//输入m*n型
	for (int i = 0; i < m; i++)
		for (int j = 0; j < n; j++)//双重循环是为了一行一行依次输入
			scanf("%d", &a[i][j]);
	int t = 0;
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++,t++) {
			if (t % n == 0) {
				printf("\n");//每行n个数输出完毕后换行
			}
			printf("%d ", a[i][j]);//输出各元素,空格隔开更加清晰
		}
	}
	return 0;
}

二,矩阵运算

 首先我们来看矩阵的加减乘运算。

(1)对于矩阵的加减运算,即各行各列的元素相加减。

思路:定义三个矩阵(二维数组),其中前两个矩阵行列数相等,第三个矩阵的元素由前两个矩阵各行各列元素相加减。

下面表示矩阵加法:

#include<stdio.h>
#define ROW 8
#define COL 8//提前指出行和列的值便于后续修改
int a[ROW][COL];
int b[ROW][COL];
int c[ROW][COL];//定义出三个矩阵,a与b表示输入的矩阵,c矩阵表示结果矩阵
int main() {
	int m, n, p, q;
	scanf("%d%d", &m, &n);
	for (int i = 0; i < m; ++i)
		for (int j = 0; j < n; ++j)
			scanf("%d", &a[i][j]);
	scanf("%d%d", &p, &q);
	for (int i = 0; i < p; ++i)
		for (int j = 0; j < q; ++j)
			scanf("%d", &b[i][j]);//输入两个矩阵
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < q; ++j){
			c[i][j] = a[i][j] + b[i][j];//矩阵加法定则
            }
	}
	int t = 0;
	for (int i = 0; i < m; ++i){
		for (int j = 0; j < q; ++j, ++t) {
			if (t%q == 0) {
				printf("\n");
			}
			printf("%d ", c[i][j]);
		 }
		}
	return 0;
}

 矩阵减法与之相同,只需修改c数组的表达式。

(2)矩阵乘法

原理即为对乘加法则;即第一矩阵相应行各元素乘第二矩阵相应列相应元素后求和。

​
​
#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#define ROW 8
#define COL 8
int a[ROW][COL];
int b[ROW][COL];
int c[ROW][COL];
int main() {
	int m, n, p, q;
	scanf("%d%d", &m, &n);
	for (int i = 0; i < m; ++i)
		for (int j = 0; j < n; ++j)
			scanf("%d", &a[i][j]);
	scanf("%d%d", &p, &q);
	for (int i = 0; i < p; ++i)
		for (int j = 0; j < q; ++j)
			scanf("%d", &b[i][j]);
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < q; ++j){
			c[i][j] = 0;
			for (int k = 0; k < n; ++k)
				c[i][j] += a[i][k] * b[k][j];
            }
	}
	int t = 0;
	for (int i = 0; i < m; ++i){
		for (int j = 0; j < q; ++j, ++t) {
			if (t%q == 0) {
				printf("\n");
			}
			printf("%d ", c[i][j]);
		 }
		}
	return 0;
}

​

​

对于矩阵的四则运算只需掌握其运算原理和法则。

(3)矩阵转置,除了矩阵的加减乘运算外,矩阵的转置也是一种重要的运算。

#include<stdio.h>
#define M 8
#define N 8
int main()
{
	int n = 0;
	int m = 0;
	scanf_s("%d %d", &n, &m);
	int arr[M][N];
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			scanf("%d", &arr[i][j]);//输入矩阵类型为n*m型
		}
	}
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			printf("%d ", arr[j][i]);
		}
		printf("\n");//转置后每一原行数输出后换行
	}
	return 0;
}

三,判断矩阵是否关于对角线对称

 矩阵的对称是对于方阵而言的,所以首先保证输入的为一个方阵。

思路:可以另设一个矩阵,使该矩阵为原矩阵的转置,再判断对应行列的元素是否相等。

#include<stdio.h>
#define M 8
#define N 8
int main() {
	int n, k=0;
	int a[M][N];
	int b[M][N];
	scanf("%d", &n);//输入矩阵的类型为n阶方阵
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < n; ++j)
			scanf("%d", &a[i][j]);
	for (int i = 0; i < n; ++i)
		for (int j = 0; j < n; ++j) {
			b[i][j] = a[j][i];//使新方阵等于原方阵的转置
			if (b[i][j] == a[i][j])
				k++;
		}
	if (k == n * n)//当k取遍方阵中的所有元素,即方阵满足对称
		printf("对称");
	else
		printf("不对称");
	return 0;
}

当然,判断方阵是否对称还是推荐肉眼观察。 

关于矩阵暂时论到这里,重要的是对于线性代数中矩阵的理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

无须logic ᭄

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

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

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

打赏作者

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

抵扣说明:

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

余额充值