我用的是艾根,我有一个矩阵:
MatrixXi x = MatrixXi::Random(5);我想使用一个随机绘制的排列(行和列都有一个排列)随机排列行和列,也就是说,如果我有一个排列,它发送索引0、1、2、3、4、-> 3、4、2、1、0,比我想要重新排序的行和列具有相同的排列顺序。
第1部分:我找不到PermutationMatrix online的一个例子,而且我很难理解语法。
第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是1e4x1e4矩阵,那么对perm *x* perm是否有效有什么想法?)
发布于 2013-04-07 18:34:39
使用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发布于 2020-05-25 07:33:12
如前所述:Stackoverflow
如果您可以使用C++11,我建议您不使用
srand()和random_shuffle()来实现它;相反,您应该在std::shuffle中使用<random>库。 首先,如果可能的话,应该避免使用rand。除了它通常不是一个很好的pRNG这一事实之外,由于共享状态,它还存在线程安全问题。<random>库通过向程序员提供对pRNG状态的显式控制和提供具有保证性能、大小和质量特性的几个选项来解决这两个问题。 其次,实际上并没有指定random_shuffle使用rand,所以理论上使用srand重新播种是合法的,这样做不会产生您想要的效果。要使用random_shuffle获得保证的结果,您必须编写自己的生成器。移到shuffle修复,因为您可以直接使用标准引擎。
#include <random> //seed generation
#include <algorithm> //shuffle()
int main() {
std::random_device r;
std::seed_seq rng_seed{r(), r(), r(), r(), r(), r(), r(), r()};
//create random engines with the rng seed
std::mt19937 eng1(rng_seed);
//create permutation Matrix with the size of the columns
Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic> permX(inputX.cols());
permX.setIdentity();
std::shuffle(permX.indices().data(), permX.indices().data()+permX.indices().size(), eng1);
inputX = inputX * permX; //shuffle column wise
}如果要对行进行洗牌,请使用inputX.rows()进行排列矩阵的初始化。然后使用inputX = permX * inputX代替。
https://stackoverflow.com/questions/15858569
复制相似问题