我有一个定义为std的矩阵:
std::vector<std::vector<double> > Qe(6,std::vector<double>(6));
并且有一个向量 v,它是:
v{0, 1, 3, 2, 4, 5};
我想按照向量v的指示交换矩阵Qe的第3列和第2列。
在Matlab中,只需编写Qe=Qe(:,v);
即可轻松完成。
我想知道除了使用for循环之外,在c++中是否有其他简单的方法可以做到这一点。
提前致谢。
鉴于您已将其实现为一组向量,因此可以使用简单的交换:
```std::swap(Qe[2], Qe[3]);
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
的优秀替代品(也就是说,我以前从未见过太多使用std::for_each
的情况,现在几乎没有了)。
std :: vector > 可用作矩阵,但您还需要自己定义它是列的向量还是行的向量。
您可以创建一个函数来完成此操作,以便每次不必编写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;
}
编辑:如果你想进行线性代数运算,有一些库可以帮助你,你不需要自己编写所有的内容。还有其他用途的数学库。
// 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]);
}
Qe[0]
是第一行还是第一列?希望是列,因为那样更容易;-) - Steve Jessop