簡體   English   中英

用c ++交換列

[英]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 ,現在幾乎沒有看到)。

取決於您如何實現矩陣。

  • 如果您有一個列向量,則可以交換列引用。 O(1)
  • 如果您有行向量,則需要使用for循環交換每行內的元素。 上)

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM