用c ++交换列

时间:2014-12-17 16:16:42

标签: c++ swap

我有一个std矩阵定义为:

std::vector<std::vector<double> > Qe(6,std::vector<double>(6));

和矢量v:

v{0, 1, 3, 2, 4, 5};

我想交换矩阵Qe的第3列和第2列,如向量v。

中所示

在Matlab中,这就像写Qe=Qe(:,v);

一样简单

我想知道除了for循环之外还有一种简单的方法可以在c ++中执行此操作。

提前致谢。

3 个答案:

答案 0 :(得分:3)

鉴于您已将此实现为向量向量,您可以使用简单的交换:

std::swap(Qe[2], Qe[3]);

这应该具有持续的复杂性。当然,这取决于您是将数据视为列专业还是行专业。但是,如果您经常要更换列,那么您需要安排数据以适应这一点(即,允许上面的代码工作)。

当您使用行主要排序(通常用于C ++)时,如果没有for循环执行该作业,您可以在技术上消除for循环(至少从您的源代码)使用标准算法代替:

std::for_each(Qe.begin(), Qe.end(), [](std::vector<double> &v) {std::swap(v[2], v[3]); });

这并没有真正改变实际发生的事情 - 它只是在标准算法中隐藏for循环本身。在这种情况下,我可能更喜欢基于范围的for循环:

for (auto &v : Qe) 
    std::swap(v[2], v[3]);

...但我从未特别喜欢std::for_each,当C ++ 11添加基于范围的for循环时,我认为这是<大多数 std::for_each 可能之前的大多数情况都是合理的可能性(IOW,我从来没有看到std::for_each使用过多,以及现在几乎没有看到。)

答案 1 :(得分:1)

取决于您如何实施矩阵。

  • 如果您有一个列向量,则可以交换列引用。 O(1)
  • 如果您有行向量,则需要使用for循环交换每行内的元素。 O(n)的

std::vector<std::vector<double>>可以用作矩阵,但您还需要自己定义它是的向量还是的向量。

你可以为此创建一个函数,这样你就不会每次都写一个for循环。例如,您可以编写一个函数,该函数接收一个矩阵,该矩阵是一个列向量和一个重排序向量(如v),并根据重新排序向量创建一个新矩阵。

//untested code and inefficient, just an example:
vector<vector<double>> ReorderColumns(vector<vector<double>> A, vector<int> order)
{
    vector<vector<double>> B;
    for (int i=0; i<order.size(); i++)
    {
        B[i] = A[order[i]];
    }
    return B;
}

编辑:如果你想做线性代数,有些图书馆可以帮助你,你不需要自己写一切。还有数学库用于其他目的。

答案 2 :(得分:0)

如果你是连续剧情。以下可能会奏效:

// To be tested
std::vector<std::vector<double> >::iterator it;
for (it = Qe.begin(); it != Qe.end(); ++it)
{
    std::swap((it->second)[2], (it->second)[3]);
}

在这种情况下,我没有看到任何其他解决方案会避免执行循环O(n)。