[英]Swap columns in c++
我有一個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 ++中執行此操作。
提前致謝。
鑒於您已將其實現為向量向量,您可以使用簡單的交換:
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
,現在幾乎沒有看到)。
取決於您如何實現矩陣。
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;
}
編輯:如果你想做線性代數,有些庫可以幫助你,你不需要自己編寫所有東西。 還有用於其他目的的數學庫。
如果你在一個場景中。 以下可能會奏效:
// 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)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.