首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有特征的矩阵的随机排列行/列

具有特征的矩阵的随机排列行/列
EN

Stack Overflow用户
提问于 2013-04-07 03:27:41
回答 2查看 8.5K关注 0票数 7

我用的是艾根,我有一个矩阵:

代码语言:javascript
复制
MatrixXi x = MatrixXi::Random(5);

我想使用一个随机绘制的排列(行和列都有一个排列)随机排列行和列,也就是说,如果我有一个排列,它发送索引0、1、2、3、4、-> 3、4、2、1、0,比我想要重新排序的行和列具有相同的排列顺序。

第1部分:我找不到PermutationMatrix online的一个例子,而且我很难理解语法。

第2部分:如何获得一个随机排列的索引向量以传递给它?也许是std::random_shuffle?

更新:

下面是一种(可能效率很低)获得一组混乱索引的方法:

代码语言:javascript
复制
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):

代码语言:javascript
复制
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是否有效有什么想法?)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-07 18:34:39

使用std::random_shuffle非常好,那么您必须使用一个PermutationMatrix:

代码语言:javascript
复制
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
票数 15
EN

Stack Overflow用户

发布于 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修复,因为您可以直接使用标准引擎。

代码语言:javascript
复制
#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代替。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15858569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档