7

私はEigenを使用しており、マトリックスを持っています:

MatrixXi x = MatrixXi::Random(5);

ランダムに描画された順列 (行と列の両方に 1 つの順列のみ) を使用して、行と列をランダムに並べ替えたいと思います。つまり、インデックス [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());

それで、問題は、行/列がpermで順序付けられるように、行列xをどのように並べ替えるかです。

更新 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 でこれを行う方法を知っている人はいますか? (以下の失敗した試みを参照してください。)

(おまけ: perm が 1e4 x 1e4 の行列の場合、 perm * x * perm が効率的かどうかについて何か考えはありますか?)

4

2 に答える 2