矩阵的旋转

Posted hapjin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了矩阵的旋转相关的知识,希望对你有一定的参考价值。

一,给定一个矩阵,用二维数组表示,不一定是方阵(N*N),求矩阵的转置(向右),和向左转置。比如:

1 2 3

4 5 6

7 8 9

向右转置:

1 4 7

2 5 8

3 6 9

 

再比如:

1 2 3

4 5 6

向 左转置

3 6

2 5

1 4

 

二,实现思路

假设原来的矩阵是M*N,转置后变成了 N*M。设原矩阵是arr[M][N],创建一个新的矩阵 rev[N][M]

对于向右转置而言,就是线性代数里面的求AT,对于arr[M][N]里面的每个元素arr[i][j],将之赋值给 rev[j][i] 即可。

 

对于向左转置,对于arr[M][N]里面的每个元素arr[i][j],将之赋值给 rev[N-j-1][i] 即可。

 

三,完整代码

public class Test{
    
    public static void main(String[] args) {
        int[][] arr1 = {{1,2,3},{4,5,6},{7,8,9}};
        int[][] arr2 = {{1,2,3},{4,5,6}};
        
        reverseRight(arr1);
        System.out.println("---------");
        reverseRight(arr2);
        
        System.out.println("***********");
        reverseLeft(arr1);
        System.out.println("-------------");
        reverseLeft(arr2);
    }
    
    public static void reverseRight(int[][] arr){
        int row = arr.length;
        int col = arr[0].length;
        
        int[][] rev = new int[col][row];
        
        for(int i = 0; i < row; i++)
        {
            for(int j = 0; j < col; j++)
                rev[j][i] = arr[i][j];
        }
        
        StringBuilder sb = new StringBuilder();
        //打印旋转后的矩阵--有col行和 row 列
        for(int i = 0; i < col; i++)
        {
            for(int j = 0; j < row; j++)
            {
                //System.out.print(rev[i][j]+" ");
                sb.append(rev[i][j] + " ");
            }
            sb.deleteCharAt(sb.length()-1);
            sb.append("\n");
//            System.out.println();
        }
        System.out.println(sb.toString());
    }
    
    public static void reverseLeft(int[][] arr)
    {
        int row = arr.length;
        int col = arr[0].length;
        
        int[][] rev = new int[col][row];
        
        for(int i = 0; i < row; i++)
        {
            for(int j = 0; j < col; j++)
            {
                rev[col-j-1][i] = arr[i][j];
            }
        }
        
        //打印旋转后的矩阵--有col行和 row 列
        for(int i = 0; i < col; i++)
        {
            for(int j = 0; j < row; j++)
            {
                System.out.print(rev[i][j] + " ");
            }
            System.out.println();
        }
    }
}

 

以上是关于矩阵的旋转的主要内容,如果未能解决你的问题,请参考以下文章

处理屏幕旋转上的片段重复(带有示例代码)

使用 ActionBar 旋转 Android 的双片段

代码题(38)— 旋转图像矩阵置零

MiniFly V1.1开源四轴驱动代码分析八:旋转矩阵控制分配矩阵等分析介绍

MiniFly V1.1开源四轴驱动代码分析八:旋转矩阵控制分配矩阵等分析介绍

MiniFly V1.1开源四轴驱动代码分析八:旋转矩阵控制分配矩阵等分析介绍