【发布时间】:2013-03-29 07:45:10
【问题描述】:
我正在使用 Eigen,我有一个矩阵:
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 来做到这一点吗? (请参阅下面无效的尝试。)
(奖励:如果 perm 是一个 1e4 x 1e4 矩阵,关于 perm * x * perm 是否有效?)
【问题讨论】:
标签: c++ random matrix permutation eigen