2013-04-07 45 views
4

行/矩陣的列我使用本徵和我有一個矩陣:隨機置換與本徵

MatrixXi x = MatrixXi::Random(5); 

我想隨機置換行和使用隨機抽取排列列(對於行和列都只是一個置換),即如果我有一個發送索引[0,1,2,3,4] - > [3,4,2,1,0]的置換比我想重新排序行和具有相同排列的列。

第1部分:我在網上找不到PermutationMatrix的示例,並且在解析語法時遇到困難。

第2部分:如何獲得一個隨機置換的向量指數傳遞給它?也許std :: random_shuffle?

更新:

這裏是一個(可能是低效的)方式來獲得一個洗好的一組指標:

std::vector<int> perm; 
for (int i=0; i<5; ++i) { 
    perm.push_back(i); 
} 

std::random_shuffle(perm.begin(), perm.end()); 

所以,現在的問題是,我該怎麼辦重新安排我的矩陣X,使得它的行/列按perm排序?

更新2:

越來越近了,這工作(的想法來源:cplusplus.com):

int myrandom (int i) { return std::rand()%i;} 

PermutationMatrix<Dynamic,Dynamic> perm(5); 

perm.setIdentity(); 
for (int i=dim-1; i>0; --i) { 
    swap (perm.indices()[i],perm.indices()[myrandom(i+1)]); 
} 

cout << "original x" << x << endl << endl; 
cout << "permuted x" << perm * x * perm << endl << endl; 

任何人都知道如何使用random_shuffle做到這一點? (見的嘗試未下面工作。)

(獎金:在燙髮* X *燙髮是否會有效的任何想法,如果燙髮是1E4 X 1E4矩陣?)

回答

9

使用std :: random_shuffle是那麼你必須使用PermutationMatrix:

PermutationMatrix<Dynamic,Dynamic> perm(size); 
perm.setIdentity(); 
std::random_shuffle(perm.indices().data(), perm.indices().data()+perm.indices().size()); 
A_perm = A * perm; // permute columns 
A_perm = perm * A; // permute rows 
+0

感謝ggael。這很接近,但是perm.indices()沒有迭代器AFAIK。我收到錯誤:'Eigen :: PermutationMatrix <-1, -1> :: IndicesType'沒有名爲'begin'的成員。我用一半的編輯來編輯我的問題,但據我可以告訴工作代碼,但我仍然想知道如何使用random_shuffle! – stackoverflax 2013-04-08 00:25:58

+0

哎呀,我太快了,現在已經修正了。 – ggael 2013-04-08 11:26:32

+0

對於在Google上發現此問題的任何人都會有相當的更新:如果您希望將相同的排列應用於行和列,則需要使用:'perm.transpose()* x * perm' – stackoverflax 2013-09-19 02:16:46