我有一个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 ++中执行此操作。
提前致谢。
答案 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)
取决于您如何实施矩阵。
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)。