C++数据结构 矩阵的转置、镜像及旋转

C++数据结构 矩阵的转置、镜像及旋转

矩阵介绍

C++ 中的矩阵是一种二维数组,用于存储数值数据。矩阵可以用于存储图像数据,以及科学和工程计算中的数据。

常用于以下场景:

数学运算:矩阵乘法、行列式计算、特征值分解等。

图像处理:图像缩放、旋转、颜色变换等。

矩阵分析:因子分析、主成分分析、协方差分析等。

线性代数:矩阵求逆、行列式计算、特征值分解等。

在 C++ 中,可以使用内置数组和 STL 中的 vector 来实现矩阵的存储和操作。在这里简单介绍一下矩阵的转置、镜像以及旋转。

矩阵的转置

使用两个循环,一个从上到下遍历矩阵中的行,一个从左到右遍历矩阵中的列(只需要遍历到行数对应的列),并交换对角线上的元素。

void Transposed(vector<vector<int>>& matrix)
{
	for(int i=0;i<matrix.size();++i){
        for(int j=0;j<i;++j){
         	int temp=matrix[i][j];
            matrix[i][j]=matrix[j][i];
            matrix[j][i]=temp;
        }
    }
}

效果:

//转置前:
1 2 3 4
5 6 7 8
//转置后:
1 5
2 6
3 7
4 8

矩阵的镜像(左右镜像)

使用两个循环,一个从上到下遍历矩阵中的行,一个从左到右遍历矩阵中的列(只需要遍历半列)。在每个位置处,交换该位置与以中间行对称位置上的数字。

void mirror(vector<vector<int>>& matrix)
{
	for(int i=0;i<matrix.size();++i){
        for(int j=0;j<matrix[i].size()/2;++j){
         	int temp=matrix[i][j];
            matrix[i][j]=matrix[i][matrix[i].size()/2-j-1];
            matrixmatrix[i][matrix[i].size()/2-j-1]=temp;
        }
    }
}

效果:

//镜像前:
1 2 3 4
5 6 7 8
//镜像后:
4 3 2 1
8 7 6 5

说明:上下镜像即是,一个从左到右遍历矩阵中的列,一个从上到下遍历矩阵中的行(只需要遍历半行)。在每个位置处,交换该位置与以中间列对称位置上的数字

矩阵的旋转(90度、180度、270度)

矩阵的旋转可以通过转置和镜像来实现:
情况一:顺时针转 90 度:先转置左右镜像
效果:

//旋转前:
1 2 3 4
5 6 7 8
//转置后:
1 5
2 6
3 7
4 8
//左右镜像后:(达到顺时针旋转90度)
5 1
6 2
7 3
8 4

情况二:顺时针转 180 度:先上下镜像,再**左右镜像(**先左右再上下也可)
效果:

//旋转前:
1 2 3 4
5 6 7 8
//上下镜像后:
5 6 7 8
1 2 3 4
//左右镜像后:(达到顺时针旋转180度)
8 7 6 5
4 3 2 1

情况三:顺时针转 270 度:先转置上下镜像
效果:

//旋转前:
1 2 3 4
5 6 7 8
//转置后:
1 5
2 6
3 7
4 8
//左右镜像后:(达到顺时针旋转270度)
4 8
3 7
2 6
1 5
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
稀疏矩阵转置是将稀疏矩阵的行列互换得到新的矩阵。 在C语言中,可以使用三元组表示法来存储稀疏矩阵。三元组表示法包括三个数组:行索引数组、列索引数组和值数组。其中,行索引数组存储非零元素所在的行号,列索引数组存储非零元素所在的列号,值数组存储非零元素的值。 稀疏矩阵转置的基本思路是遍历原始稀疏矩阵,将每个非零元素的行列互换后存储到新的稀疏矩阵中。 下面是一个示例代码实现: ```c #include<stdio.h> #define MAX_TERMS 100 typedef struct { int row; int col; int value; } Element; void transpose(Element a[], Element b[]) { int n, m, terms, i, j, currentB; n = a[0].row; m = a[0].col; terms = a[0].value; b[0].row = m; b[0].col = n; b[0].value = terms; if (terms > 0) { currentB = 1; for (j = 0; j < m; j++) { for (i = 1; i <= terms; i++) { if (a[i].col == j) { b[currentB].row = a[i].col; b[currentB].col = a[i].row; b[currentB].value = a[i].value; currentB++; } } } } } int main() { int n, m, i, j, count = 1; printf("Enter the number of rows and columns: "); scanf("%d %d", &n, &m); Element a[MAX_TERMS], b[MAX_TERMS]; a[0].row = n; a[0].col = m; printf("Enter the elements of the matrix: \n"); for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { int element; scanf("%d", &element); if (element != 0) { a[count].row = i; a[count].col = j; a[count].value = element; count++; } } } transpose(a, b); printf("\nOriginal sparse matrix:\n"); for (i = 0; i <= a[0].value; i++) { printf("%d\t%d\t%d\n", a[i].row, a[i].col, a[i].value); } printf("\nTransposed sparse matrix:\n"); for (i = 0; i <= b[0].value; i++) { printf("%d\t%d\t%d\n", b[i].row, b[i].col, b[i].value); } return 0; } ``` 这段代码中,我们首先定义了一个 `Element` 结构体来表示稀疏矩阵的非零元素。然后,使用 `transpose` 函数来实现稀疏矩阵转置操作。最后,在 `main` 函数中,我们可以输入稀疏矩阵的行列数和元素,并输出原始稀疏矩阵转置后的稀疏矩阵。 希望这段代码能帮助到你!如果有任何问题,请随时向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值