将一维向量中表示的矩阵旋转 90 度

Posted

技术标签:

【中文标题】将一维向量中表示的矩阵旋转 90 度【英文标题】:Rotate a matrix represented in a 1D vector by 90 degrees 【发布时间】:2020-12-10 04:06:04 【问题描述】:

我想将一个以一维向量形式表示的矩阵旋转 90 度。

当它是 2D 时,这就是我所做的工作:

void rotate(vector<vector<int>>& matrix) 
    reverse(matrix.begin(), matrix.end());
    for (int i = 0; i < matrix.size(); ++i)
        for (int j= i + 1; j < matrix[0].size(); ++j) 
            swap(matrix[i][j], matrix[j][i]);
        
    

当我用一维表示时,例如:

vector<int> matrix = 1, 2, 3, 4, 5, 6, 7, 8, 9;

这是我尝试过的:

void rotate(vector<int>& matrix, const int& n) 
    int i = 0, j = 0;
    for (i = 0; i < n; ++i) 
        for (j = i + 1; j < n; ++j) 
            swap(matrix[i + j], matrix[i + j * n]);
        
        reverse(matrix.begin() + i * n, matrix.begin() + (i * n) + j);
    

结果是:

matrix = 7, 4, 1, 6, 5, 8, 9, 2, 3

预期的结果应该是:

matrix = 7, 4, 1, 8, 5, 2, 9, 6, 3

在索引方面是否有更好的方法或我缺少什么?

【问题讨论】:

我不知道 将矩阵旋转 90 度 是什么意思。请详细说明。 嗨,Sahu,顺时针旋转 90 度将给出矩阵 m = [[1,2,3],[4,5,6],[7,8,9]],结果 [ [7,4,1],[8,5,2],[9,6,3]],现在给定一维向量中的 m,我想在原地做同样的事情并得到 [7,4,1, 8,5,2, 9,6,3]。谢谢! 我猜这里“将矩阵旋转 90 度”的意思是“转置矩阵” 就像你说的,在索引方面出了点问题:只需执行 swap(matrix[i * n + j], matrix[i + j * n]) 并删除对 reverse 的调用?还应更改第 j 次迭代的边界并从“i”开始 【参考方案1】:

你几乎明白了。

在这一行:

swap(matrix[i + j], matrix[i + j * n]);

您的第一个索引应该是i * n + j。这基本上是将 2D 索引转换为 1D 的“公式”(仅适用于方阵)。所以,matrix[i][j] 变成了matrix[i * n + j]。反过来也一样:matrix[j][i] 变为 matrix[j * n + i],就像您最初在第二个交换参数上所做的那样。

最后,在这一行:

reverse(matrix.begin()+i*n, matrix.begin() + (i*n)+ j);

最后一个表达式应该是(i * n) + n

为了解释这一点,您可以浏览代码。假设我们到达第二个反向,在内循环完成后,我们处于外循环的第二次迭代 (i = 1)。数组在反向之前看起来像这样:

. . . 2 5 8 . . .

我们想把这个组反转成这样:

. . . 8 5 2 . . .

现在为了反转中间部分,我们需要获取这三个数字的索引范围。

在这种情况下,起始索引为i * n1 * 3 = 3(i * n) + n(或(i + 1) * n)的计算结果为(1 * 3) + 3 = 6,正确表示结束索引。

【讨论】:

以上是关于将一维向量中表示的矩阵旋转 90 度的主要内容,如果未能解决你的问题,请参考以下文章

将下面矩阵分别按顺时针90度,逆时针90度,和旋转180度,打印出来

将Opencv矩阵旋转90、180、270度[重复]

二维数组(矩阵)之将矩阵旋转90度

如何将 N x N 矩阵旋转 90 度? [关闭]

计算中表示旋转的几种方法

将 N x N 矩阵逆时针旋转 90 度。为啥填写值的顺序很重要?