矩阵的旋转,转置和翻转以及它们的关系


//已知新数组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("\n"); } printf("\n"); for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%3d ",b[i][j]); printf("\n"); } 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("\n");
    }  
    printf("\n");
    for(i=0;i<3;i++)
    {    for(j=0;j<3;j++)
                printf("%3d  ",b[i][j]); 
        printf("\n");
    }                      
    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("\n");
    }  
    printf("\n");
    for(i=0;i<3;i++)
    {    for(j=0;j<3;j++)
                printf("%3d  ",c[i][j]); 
        printf("\n");
    }                      
    return 0;    
}

 

 
posted @ 2013-07-29 21:02  Geekers  阅读(1801)  评论(0编辑  收藏  举报