学习笔记——矩阵的相关运算

目录

1、矩阵的定义(n个长度为m的数组)

2、矩阵的水平翻转

3、矩阵的垂直翻转

4、矩阵的顺时针旋转

5、矩阵的逆时针旋转

6、矩阵的转置

7、二维数组

8、二维数组的索引

9、二维数组的函数传参

10、矩阵乘法

力扣463. 岛屿的周长


1、矩阵的定义(n个长度为m的数组)

  矩阵An×m​ 的定义是按照长方阵列排列的复数或实数集合,其中 n 代表行数, m 代表列数。在C语言中,我们可以用A[n][m]来代表一个 n×m 的矩阵,其中A[i][j]代表矩阵第 i 行,第 j 列的值。

int n,m;
cin>>n>>m;
int a[n][m];

2、矩阵的水平翻转

  矩阵的水平翻转,就是将矩阵的每一行的元素进行逆序。

for(int i=n-1;i>=0;i--){
	for(int j=0;j<m;j++){
		cout<<a[i][j]<<" ";
	}
    cout<<endl;
}

3、矩阵的垂直翻转

  矩阵的垂直翻转,就是将矩阵的每一列的元素进行逆序。

for(int i=0;i<n;i++){
	for(int j=m-1;j>=0;j--){
		cout<<a[i][j]<<" ";
	}
    cout<<endl;
}

4、矩阵的顺时针旋转

  矩阵的顺时针旋转 90 度,顾名思义,就是绕着垂直屏幕向里的方向,对矩阵进行 90度旋转,这时候行列会交换。

    for(int i=0;i<m;i++){
		for(int j=n-1;j>=0;j--){
		cout<<a[j][i]<<" ";
	}
	cout<<endl;
	}	

5、矩阵的逆时针旋转

  矩阵的逆时针旋转 90 度,我们可以理解成 顺时针旋转 270 度,所以就是做 3 次顺时针旋转 90 度的操作。

	for(int i=m-1;i>=0;i--){
		for(int j=0;j<n;j++){
		cout<<a[j][i]<<" ";
	}
	cout<<endl;
	}	

6、矩阵的转置

  矩阵的转置,就是对矩阵的主对角线对称的元素进行交换的操作。也可以理解为行与列进行交换。

	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
		cout<<a[j][i]<<" ";
	}
	cout<<endl;
	}

7、二维数组

  C语言中,二维数组可以用来描述矩阵,定义如下(3 行 4 列):

int a[3][4];

  我们也可以将二维数组的元素进行初始化,如下:

int a[3][4] = {
	{5, 2, 0, 4},
	{1, 3, 1, 7},
	{4, 0, 0, 9},
};

  由于编译器能够通过后面的初始化列表知道到底有多少个数据元素,所以第一个中括号中的数字可以省略(但是第二个不能省略),如下:

int a[][4] = {
	{5, 2, 0, 4},
	{1, 3, 1, 7},
	{4, 0, 0, 9},
};

  当然,我们还可以定义一个大数组,但是只初始化其中几行元素:

int a[100][4] = {
	{5, 2, 0, 4},
	{1, 3, 1, 7},
	{4, 0, 0, 9},
};

  本质上,你可以把二维数组理解成一个一维数组。只不过一维数组的每一个元素,也是一个一维数组。

8、二维数组的索引

  C语言中数组下标从 0 开始,那么,如果要取得数组a的 i行 j 列的元素,可以通过a[i][j]进行获取。

9、二维数组的函数传参

  如果你已经了解了一维数组的传参,那么大概应该能猜出二维数组的传参。
  回顾一下一维数组的传参,用的是一个*,如下:

int add(int *nums, int numsSize) {
    // ...
}

  那么二维数组的传参,用的就是两个*(二维指针),如下:

int diagonalSum(int** mat, int matSize, int* matColSize){
}

  其中matSize代表二维数组第一维的大小,也就是可以理解成有多少行;int* matColSize是一个一维数组,代表每一行有多少列,即matColSize[0]代表第 0 行有matColSize[0]列,matColSize[1]代表第 1 行有matColSize[1]列,matColSize[i]代表第 ii 行有matColSize[i]列,以此类推。
  由于矩阵的每一列元素都是一样的,所以这类题目中,我们一般可以初始化怎么写:

int diagonalSum(int** mat, int matSize, int* matColSize){
    r = matSize;
    c = matColSize[0];
    // TODO
}

  这样写的好处是把变量命名简单化,后续使用的时候不容易出错,让代码更加易读。

10、矩阵乘法

        在我的另一个文章:

https://blog.csdn.net/weixin_63033110/article/details/134001927?spm=1001.2014.3001.5502
 

力扣463. 岛屿的周长

        给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。

        网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。

        岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。

使用c++代码实现:

#include<iostream> 
using namespace std;
int main(){
	int n,m;
	cin>>n>>m;
	int grid[n][m];
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cin>>grid[i][j];
		}
	}
	int sum=0;	
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(grid[i][j]==1){
				if(i==0||grid[i-1][j]==0)sum++;//对上面进行判断
				if(i==n-1||grid[i+1][j]==0)sum++;//对下面进行判断
				if(j==0||grid[i][j-1]==0)sum++;//对左面进行判断
				if(j==m-1||grid[i][j+1]==0)sum++;//对右面进行判断
			}
		}
	}
	cout<<sum;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

怼您恏1031

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

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

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

打赏作者

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

抵扣说明:

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

余额充值