【问题标题】:swapping an inner and outer vector交换内部和外部向量
【发布时间】:2011-10-29 19:59:25
【问题描述】:

我定义了一个 myObjects 向量的向量,基本上创建了一个二维数组。我想转置这个数组,使行变成列,列变成行。显然,我可以在双 for 循环中执行此操作,但这似乎非常不优雅并且会非常慢。我想知道 C++ 或 STL 中是否有一些聪明的东西可以让我快速有效地交换内部和外部向量,而不是编写......

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

【问题讨论】:

  • 它有什么不雅之处?没有办法让你不得不移动这段记忆。
  • 除了制作一个新的向量,你能不做一堆交换吗?不知道什么会更快。转置的另一种替代方法可能只是创建一个为您反转索引的函数——这样您就可以像转置一样使用它。
  • 是的,就是这样。不过,您的限制和目标是什么并不是很清楚(例如,空间是否重要?)。这纯粹是一个样式/语法问题吗?
  • 我之前在这里看到过有关如何使用 boost::extents 旋转 ND 阵列索引的问题,但记不清了

标签: c++ multidimensional-array matrix


【解决方案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];
    }

    // ...
};

这会降低转置矩阵的成本,但会增加实际访问元素的成本。

【讨论】:

  • 问题是,访问元素或转置更常见的是什么?
【解决方案2】:

我的建议是创建一个名为 Matrix 的类,其中包含您正在谈论的矩阵。给类一个函数transpose() 来切换状态“转置”的状态标志。然后,重载 [] 运算符,以遵循 mwd 的建议,在矩阵处于转置状态时反转索引。

【讨论】:

    【解决方案3】:

    您已经编写的代码几乎是最简单的方法。真的你不需要向量的向量。您可以将每个新“行”附加到单个向量。那么当 n 是矩阵的“宽度”时,原始向量向量中的元素矩阵 [i][j] 现在是矩阵 [(i*n)+j]。繁琐的部分是提出执行转置的算法。我并不是说这种方式更好,但它是另一种方式,你已经得到的很好。

    【讨论】:

      【解决方案4】:

      最好的办法是使用 Eigen 矩阵库,它将转置属性存储在矩阵类的参数中。如果这不是一个选项,请在谷歌上搜索众多矩阵转置算法之一。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-15
        • 2021-12-26
        • 1970-01-01
        • 2016-07-12
        • 2021-04-15
        • 1970-01-01
        相关资源
        最近更新 更多