将一维向量中表示的矩阵旋转 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 * n
或1 * 3 = 3
,(i * n) + n
(或(i + 1) * n
)的计算结果为(1 * 3) + 3 = 6
,正确表示结束索引。
【讨论】:
以上是关于将一维向量中表示的矩阵旋转 90 度的主要内容,如果未能解决你的问题,请参考以下文章