特征:随机二进制向量,t 1s

时间:2016-07-12 15:37:00

标签: c++ random eigen

我想计算K*es其中KEigen矩阵(维度pxp),espx1随机二进制矢量用1s。

例如,如果p=5t=2可能es[1,0,1,0,0]'[0,0,1,1,0]',等等......

如何使用es轻松生成Eigen

3 个答案:

答案 0 :(得分:2)

我想出了一个更好的解决方案,它是std::vectorEgien::Mapstd::shuffle的组合。

std::vector<int> esv(p,0);
std::fill_n(esv.begin(),t,1);
Eigen::Map<Eigen::VectorXi> es (esv.data(), esv.size());
std::random_device rd;
std::mt19937 g(rd());
std::shuffle(std::begin(esv), std::end(esv), g);

此解决方案具有内存效率(因为Eigen::Map不会复制esv),并且具有很大的优势,即如果我们想要多次置换es(就像在这种情况下一样) ),那么我们只需要重复std::shuffle(std::begin(esv), std::end(esv), g);

也许我错了,但这个解决方案似乎比以前更优雅,更有效。

答案 1 :(得分:0)

所以你正在使用Eigen。我不确定您使用的矩阵类型,但我会离开班级Eigen::MatrixXd

您需要做的是:

  • 创建一个全0
  • 的1xp矩阵
  • 选择随机点从0到1翻转,介于0-p之间,并确保该点是唯一的。

以下代码应该可以解决问题,尽管您可以通过其他方式实现它。

//Your p and t
int p = 5;
int t = 2;

//px1 matrix
MatrixXd es(1, p);

//Initialize the whole 1xp matrix
for (int i = 0; i < p; ++i)
        es(1, i) = 0;

//Get a random position in the 1xp matrix from 0-p
for (int i = 0; i < t; ++i)
{
    int randPos = rand() % p;

    //If the position was already a 1 and not a 0, get a different random position
    while (es(1, randPos) == 1)
        randPos = rand() % p;

    //Change the random position from a 0 to a 1
    es(1, randPos) = 1;
}

答案 2 :(得分:0)

t接近p时,Ryan的方法需要生成超过t个随机数。为避免此性能下降,您可以解决原始问题

  

从[0,p)中找到均匀分布的t个不同的数字

通过以下步骤

  1. 从[0,p-t + 1]生成t均匀分布的随机数idx[t]

  2. 对这些数字idx[t]

  3. 进行排序
  4. idx[i]+i, i=0,...,t-1是结果

  5. 代码:

    VectorXi idx(t);
    VectorXd es(p);
    es.setConstant(0);
    
    for(int i = 0; i < t; ++i) {
      idx(i) = int(double(rand()) / RAND_MAX * (p-t+1));
    }
    
    std::sort(idx.data(), idx.data() + idx.size());
    
    for(int i = 0; i < t; ++i) {
      es(idx(i)+i) = 1.0;
    }