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统计文件夹下所有文件的数量
    Linux查看文件最后几行的命令
    linux export将PATH环境变量误删了的解决办法
    laravel提示Mcrypt PHP extension required
    php(cli模式)执行文件传递参数
    shell判断文件是否存在,不存在则创建
    php获取Linux网卡信息
    使用iptraf,ifstat查看网络流量
    作用域
    头文件,库文件,重复包含
  • 原文地址:https://www.cnblogs.com/Lee-geeker/p/3223938.html
Copyright © 2011-2022 走看看