2016-04-02 68 views
-1

我有C++,A(N,N)的矩陣矩陣和向量P(n)的,其看起來像這樣的:重新排序在C + +

P = [ 3 6 1 13 12 16 ... ] 

它包含數字1:n的但不是在按升序排列,但亂七八糟。

我的目標是行和矩陣A的列改變爲相同的順序。例如,因爲P [0] = 3我想第3行3列移到第1行和列的矩陣A

但因爲矩陣可能是潛在的真正的大,我不能用另一矩陣大小與A相同,因爲這會浪費。

在MATLAB這可以簡單地通過使用命令來完成:

A(P,P); 

如何做同樣的事情在C任何想法++?

+0

「自P [1]是3」 - 注意,C++從0開始 – MSalters

+0

改變了它。通過強制習慣我使用了matlab索引。 – System

回答

1

我會建議使用一個間接層,以定位在小區中的每個矩陣。

比方說,你的矩陣對象被稱爲M。除了使用

M[R][C] 

的指細胞在R行,列C(假設行優先矩陣排序),你會有一對相關聯的載體,我們姑且稱之爲yx,這樣的價值行RC所述細胞是:

M[y[R]][x[C]] 

最初,既yx矢量映射每個「邏輯」的行或列以相應的物理的行和列,也就是既yx包含[0..max_row]和[0..max_col]。

然後,要在您的問題中進行交換,只需將您的P矢量複製到yx矢量。

你不應該直接實現你的矩陣,作爲二維std::vector,但作爲一個獨立的類:

class Matrix { 

public: 

// ... 

    auto operator()(size_t R, size_t C) const; 

    auto &operator()(size_t R, size_t C); 

// ... 
}; 

和執行行和列的間接映射作爲類實現的一部分。

+0

間接映射可以在不使用輔助矩陣的情況下完成嗎? – System

+0

誰對補充矩陣有什麼評論?只有兩個向量。這些信息必須存儲在某個地方。這是根本。 –

+0

我不確定我是否正確理解如何實現它。將P複製到y和x後,我如何在我的矩陣上使用它? – System

1

最簡單的方法可能是隻是蠻力它。最好的想法可能是逐行進行。您需要一個長度爲N的幫助程序數組,它跟蹤原始行索引和一個臨時行。然後,從行R = 0開始,檢查行R是否在正確位置。如果沒有,將其複製到臨時行,將右行復制到R行(在行進中進行置換),並將臨時行復制到剛剛釋放的位置。如果一行恰好位於正確的位置,請將其複製到臨時行,並在複製時將其排列。

+0

然後對列做同樣的事情嗎?它不會像使用第二個矩陣一樣嗎? – System

+0

@系統:不,您不需要爲列進行任何操作 - 在將每行移動到正確的位置時對其進行排列。不,這隻使用一個額外的行。但它當然不像第二個矩陣那麼高效。該算法可以通過不立即複製臨時行來優化。這意味着你不會按行順序工作。相反,您將行0複製到臨時行,將行N複製到行0,然後找到應該行到行N的行。通常,這是其他行M,在這種情況下過程繼續,但請記住它也可能是臨時排。 – MSalters

+0

謝謝,我想我可以做到這一點。爲什麼它不如第二個矩陣有效? – System