当表示为对象的一维向量时,有效地旋转 NxM 矩阵 (C++)
Rotate NxM Matrix Efficiently when Represented as a One Dimensional Vector of Objects (C++)
到目前为止,我想出顺时针旋转NxM(N不一定等于M(矩阵的唯一方法(当它表示为高度和宽度变量分开存储的一维向量时(如下:
struct matrix
{
vector<int> data;
int height;
int width;
void rotate_90()
{
vector<int> newdata(height*width);
for(int index = 0; index < height*width; index++)
{
int x = index % width;
int y = index/width; // integer division
int nextindex = (x+1)*height - 1 - y;
newdata[nextindex] = data[index];
}
data = newdata;
int temp = height;
height = width;
width = temp;
}
};
虽然这种方法确实有效,但我相信有一种更有效的方法(特别是在节省时间方面;空间不是问题(。 必须创建一个全新的向量,然后用新向量覆盖旧向量,这对我来说并不合适。 有没有更有效的解决方案?
请记住,我上面提供的只是为了说明。 我实际代码中的data
向量使用对象而不是整数;使用 ints 只是为了更容易测试。 因此,像 Eigen 这样的线性代数库在这里无济于事。
如果可能的话,我会尽量避免完全复制数据,只在访问元素时转换索引:
struct matrix {
vector<int> data;
int height;
int width;
int& at(int x,int y) { return data(x + y*width); }
struct rotated_view {
matrix& base;
rotated_matrix_view(matrix& base) : base(base) {}
int& at(int x,int y) { return base.at(y,base.height-x-1); }
}
rotated_view rotated() { return rotated_view(*this); }
};
请注意,根据您的访问模式,这可能会具有相当差的性能。另一方面,按列访问原始矩阵中的元素几乎与通过rotated_matrix_view
逐行访问它们一样低效。如果你确实关心性能(当然你关心,否则你为什么要使用C++ ;)我建议您同时尝试索引转换和实际旋转,看看哪个更好。
相关文章:
- 与互斥锁相比,旋转锁可以保证上下文切换
- 绘制旋转的三角形
- 旋转模型矩阵时的形状失真
- 四边形的 2D 旋转
- 垂直方向的 Gtk3+ 旋转按钮 (c/c++)
- 发布旋转矩阵(openGL/glm)
- 顺时针迭代旋转 3 位数字
- 形状对象的旋转和缩放不正确C++
- 如何在 OpenSceneGraph 中缩放/旋转/移动资产
- 如何有效地计算将单位立方体映射到自身的反射和旋转?
- 子轴围绕父轴而不是他自己的轴旋转
- 将使用太多的纹理插值器 - 带旋转的着色器
- SFML 向下移动时如何围绕屏幕中心旋转?
- 如何在OpenGL中正确旋转和缩放对象?
- 使用 C++在 OpenGL 中移动自动旋转的 3D 多边形
- 按时间自动旋转形状,同时在 OpenGL 中使用C++移动它们
- 如何使用增强::几何计算多边形的旋转固体体积?
- 使用 GDI+ 旋转位图,然后转换为 HDC
- 如何绕任意轴旋转点?
- 当表示为对象的一维向量时,有效地旋转 NxM 矩阵 (C++)