zoukankan      html  css  js  c++  java
  • 矩阵的旋转,转置和翻转以及它们的关系

    
    
    //已知新数组b[i][j]
    //顺时针旋转
    //90°
    //原数组的列为新数组的行
    //原数组的行=N-1-新数组的列
    
    //180°
    //原数组的行=N-1-新数组的行
    //原数组的列=M-1-新数组的列
    
    //270°
    //原数组的列=M-1-新数组的行
    //原数组的行=新数组的列
    
    
    
    
    
    //得出结论
    /*
    顺时针选择90° = 转置 + 水平翻转
    逆时针旋转90° = 转置 + 垂直翻转 = 顺时针旋转 270°
    */
    
    
    





    //
    矩阵的旋转 //顺时针旋转90° #include<stdio.h> int main() { int i,j; int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; int b[3][3]={0}; for(i=0;i<3;i++) for(j=0;j<3;j++) { b[i][j] = a[2-j][i]; } for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%3d ",a[i][j]); printf(" "); } printf(" "); for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%3d ",b[i][j]); printf(" "); } return 0; }


    /*
    方法I:已知新数组b[i][j]:                      
    原数组的列为新数组的行                                           
    原数组的行=2-新数组的列                                   
    b[i][j]=a[2-j][i]

     for(i=0;i<4;i++)

          for(j=0;j<3;j++)

             b[i][j]=a[2-j][i];

    方法II:已知原数组a[i][j]: 新数组的行为原数组的列 新数组的列=2-原数组的行 b[j][2-i] = a[i][j]
    方法II只要修改蓝色代码为:
    for(i=0;i<3;i++) for(j=0;j<4;j++) b[j][2-i] = a[i][j];

    特别注意for循环的循环次数
    */
    
    
    
    
    
    /*对于一个 N*M 的矩阵来说,
            顺时针旋转90° 
    
    原数组的列为新数组的行
    原数组的行=(N-1)-新数组的列
    
    */

              
    
    
    
     
    /*
    2:顺时针180度
    方法I:
    已知新数组b[i][j]:
    原数组的行=(N-1)-新数组的行
    原数组的列=(M-1)-新数组的列
    b[i][j]=a[2-i][3-j]
    
    方法II:
    已知原数组a[i][j]:
    新数组的行=(N-1)-原数组的行
    新数组的列=(M-1)-原数组的列
    b[2-i][3-j]=a[i][j]
    
    */

    //方法I:
    for(i=0;i<4;i++)
       for(j=0;j<3;j++)
            b[i][j]=a[2-i][3-j];
    
    //方法II:
    for(i=0;i<3;i++)
      for(j=0;j<4;j++)
        b[2-i][3-j]=a[i][j];
    
    
    
     
    /*
    3:顺时针270度
    方法I:
    已知新数组b[i][j]:
    原数组的列=(M-1)-新数组的行
    原数组的行=新数组的列
    b[i][j]=a[j][3-i]
    
    方法II:
    已知原数组a[i][j]:
    新数组的行= (M-1)-原数组的列
    新数组的列=原数组的行
    b[3-j][i]=a[i][j]
    
    */
    //转置测试
    #include<stdio.h>
    int main()
    {
        int i,j;
        int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
        int b[3][3]={0};
        for(i=0;i<3;i++)
            for(j=0;j<3;j++)
                b[i][j] = a[j][i];
            for(i=0;i<3;i++)
        {    for(j=0;j<3;j++)
                    printf("%3d  ",a[i][j]); 
            printf("
    ");
        }  
        printf("
    ");
        for(i=0;i<3;i++)
        {    for(j=0;j<3;j++)
                    printf("%3d  ",b[i][j]); 
            printf("
    ");
        }                      
        return 0;
        
    }


    //水平翻转 + 转置 测试
    #include<stdio.h>
    int main()
    {
        int i,j;
        int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
        int b[3][3]={0};
        int c[3][3]={0};
        for(i=0;i<3;i++)
            for(j=0;j<3;j++)
                b[i][j] = a[j][i];
        for(i=0;i<3;i++)
            for(j=0;j<3;j++)
                c[i][j] = b[2-i][j];
        for(i=0;i<3;i++)
        {    for(j=0;j<3;j++)
                    printf("%3d  ",a[i][j]); 
            printf("
    ");
        }  
        printf("
    ");
        for(i=0;i<3;i++)
        {    for(j=0;j<3;j++)
                    printf("%3d  ",c[i][j]); 
            printf("
    ");
        }                      
        return 0;    
    }
    
    
    
     
  • 相关阅读:
    Linux编程make命令(转)
    如何处理Global symbol * requires explicit package name编译错误,以及use strict用法
    6235与旧版本的区别
    Linux下动态链接库的使用
    MTK Socket学习——HTTP请求
    指针和指针的引用
    VC/MFC Combo Box控件的用法
    makefile教程
    常用数据类型使用转换详解
    Linux发送与接收信息
  • 原文地址:https://www.cnblogs.com/Lee-geeker/p/3223938.html
Copyright © 2011-2022 走看看