交换内部和外部矢量

时间:2011-08-18 13:59:49

标签: c++ multidimensional-array matrix

我定义了myObjects矢量向量,基本上创建了一个2D数组。我想转置这个数组,使行成为列,列成为行。显然我可以用双循环来做到这一点,但这看起来非常不优雅,而且速度很慢。我想知道在C ++或STL中是否有一些聪明的东西可以让我快速有效地交换内部和外部向量,而不是写...

for (int iRow = 0; iRow < nRows; ++iRow)
{
      for (int iCol = 0; iCol < nCols; ++iCol)
      {
         myNew2DArray[iCol][iRow] = myOriginal2DArray[iRow][iCol];
      }
}

4 个答案:

答案 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属性存储在矩阵类的参数中。如果这不是一个选项,请谷歌搜索众多矩阵转置算法之一。