将矩阵旋转到位
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
如果这是关于矩阵旋转的仅逻辑问题,我相信您可以通过将(一个或两个?)<
替换为<=
来纠正您的结果。另外,请注意您的图片尺寸为 309x309(奇数!),而您留下的中间没有被N/2
纠正。可能的解决方案是添加 1 - 将 N/2
替换为
N % 2 == 0 ? N / 2 : N / 2 + 1
【讨论】:
以上是关于将矩阵旋转到位的主要内容,如果未能解决你的问题,请参考以下文章