我定义了myObjects矢量向量,基本上创建了一个2D数组。我想转置这个数组,使行成为列,列成为行。显然我可以用双循环来做到这一点,但这看起来非常不优雅,而且速度很慢。我想知道在C ++或STL中是否有一些聪明的东西可以让我快速有效地交换内部和外部向量,而不是写...
for (int iRow = 0; iRow < nRows; ++iRow)
{
for (int iCol = 0; iCol < nCols; ++iCol)
{
myNew2DArray[iCol][iRow] = myOriginal2DArray[iRow][iCol];
}
}
答案 0 :(得分:1)
或者,您可以将矩阵存储在向量中,并具有一个标志,指定矩阵是否已转置。然后你只需计算索引。这是一个例子:
class Matrix {
private:
std::vector<int> matrix;
bool isTransposed = false;
int width, height;
public:
// ...
int getElement(int x, int y)
{
int w = width;
int h = height;
if(isTransposed) {
int z = x;
x = y;
y = x;
z = w;
w = h;
h = z;
}
return matrix[y * width + x];
}
// ...
};
这将降低转置矩阵的成本,但会增加实际访问元素的成本。
答案 1 :(得分:0)
我的建议是创建一个名为Matrix
的类,其中包含您正在讨论的矩阵。为类提供一个函数transpose()
,用于切换状态“transposed”的状态标志。然后,重载[]运算符以遵循mwd建议在矩阵处于转置状态时反转indeces。
答案 2 :(得分:0)
您编码的内容几乎是最简单的方法。真的,你不需要矢量矢量。您可以将每个新的“行”附加到单个向量中。那么当你的原始矢量向量中的元素矩阵[i] [j]现在是矩阵[(i * n)+ j],当n是矩阵的“宽度”时。这个繁琐的部分提出了执行转置的算法。我不是说这种方式更好,但它是另一条路,而你已经拥有的很好。
答案 3 :(得分:0)
您最好的选择是使用特征矩阵库,它将transposedness属性存储在矩阵类的参数中。如果这不是一个选项,请谷歌搜索众多矩阵转置算法之一。