通过学习线性代数我们更为深刻地认识了矩阵,那么当矩阵遇上了编程会有什么样的化学反应呢?
本篇将介绍有关矩阵的几种简单编程类型。
一,输入输出矩阵
(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;
}
当然,判断方阵是否对称还是推荐肉眼观察。
关于矩阵暂时论到这里,重要的是对于线性代数中矩阵的理解。