将矩阵旋转到位

Posted

技术标签:

【中文标题】将矩阵旋转到位【英文标题】:Rotate matrix in place 【发布时间】:2014-01-13 10:50:37 【问题描述】:

我正在解决 原地旋转 NxN 矩阵问题。

我的代码似乎进行了旋转,但在图像上留下了一个 X。 所以我猜它错误地旋转了边缘。 我正在附加两个图像作为示例输入和输出。

我的代码有什么问题:

public static void rotateRight(float[][] img)
    for (int i=0; i<N/2; i++)
        for (int j=i; j<N-i; j++)
            int J_COMP = N-j-1; //complement of J
            int LEFT = i;
            int RIGHT = N-i-1;
            int TOP = i;
            int BOTTOM = N-i-1;

            float temp = img[J_COMP][LEFT];
            img[J_COMP][LEFT] = img[BOTTOM][J_COMP];
            img[BOTTOM][J_COMP] = img[j][RIGHT];
            img[j][RIGHT] = img[TOP][j];
            img[TOP][j] = temp;
        
           

【问题讨论】:

你为什么不使用调试器来找出它在做什么? 以上评论没有多大帮助 【参考方案1】:

您正在旋转主对角线两次。

修复内部循环(参见“修复”注释)

package tests.***;

public class Question_20773692 

    private static int N;

    public static void main(String[] args) 

        float[][] img;
        int count;

        N=3;
        count = 0;
        img = new float[N][N];
        for(int i=0; i<N; ++i) 
            for(int j=0; j<N; ++j) 
                img[i][j] = count++;
            
        

        printImg(img);

        rotateRight(img);

        printImg(img);

    

    public static void printImg(float[][] img) 
        for(int j=0; j<N; ++j) 
            System.out.print("-");
        
        System.out.println();
        for(int i=0; i<N; ++i) 
            for(int j=0; j<N; ++j) 
                System.out.print((int)(img[i][j]));
            
            System.out.println();
        
        for(int j=0; j<N; ++j) 
            System.out.print("-");
        
        System.out.println();   

    public static void rotateRight(float[][] img)
        for (int i=0; i<N/2; i++)
            for (int j=i; j<N-i; j++)
            //for (int j=i+1; j<N-i; j++) //fix
                int J_COMP = N-j-1; //complement of J
                int LEFT = i;
                int RIGHT = N-i-1;
                int TOP = i;
                int BOTTOM = N-i-1;

                float temp = img[J_COMP][LEFT];
                img[J_COMP][LEFT] = img[BOTTOM][J_COMP];
                img[BOTTOM][J_COMP] = img[j][RIGHT];
                img[j][RIGHT] = img[TOP][j];
                img[TOP][j] = temp;
            
               
    

【讨论】:

【参考方案2】:

矩阵的就地旋转....我想这应该可行。

public void rotate(ArrayList<ArrayList<Integer>> a) 
    int n=a.size()/2;
    for(int i=1;i<=n;i++)
        ArrayList<Integer>temp=a.get(i-1);
        a.set(i-1,a.get(a.size()-i));
        a.set(a.size()-i,temp);
    
    for(int i=0;i<a.size();i++)
        for(int j=i+1;j<a.get(0).size();j++)
            a.get(i).set(j,a.get(i).get(j)^a.get(j).get(i));
            a.get(j).set(i,a.get(i).get(j)^a.get(j).get(i));
            a.get(i).set(j,a.get(i).get(j)^a.get(j).get(i));
    


【讨论】:

【参考方案3】:

如果你是关于旋转图片,我建议使用java.awt.geom.AffineTransform

如果这是关于矩阵旋转的仅逻辑问题,我相信您可以通过将(一个或两个?)&lt; 替换为&lt;= 来纠正您的结果。另外,请注意您的图片尺寸为 309x309(奇数!),而您留下的中间没有被N/2 纠正。可能的解决方案是添加 1 - 将 N/2 替换为

N % 2 == 0 ? N / 2 : N / 2 + 1

【讨论】:

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

矩阵中旋转变换公式是指逆时针旋转还是顺时针 有啥不同啥意思

如何在 OpenGL 中围绕 Z 轴中心旋转对象?

使用opencv将旋转矩阵旋转到欧拉角

旋转矩阵公式

将矩阵旋转 n 次

分解旋转矩阵