我想计算K*es
其中K
是Eigen
矩阵(维度pxp
),es
是px1
随机二进制矢量用1s。
例如,如果p=5
和t=2
可能es
为[1,0,1,0,0]'
或[0,0,1,1,0]'
,等等......
如何使用es
轻松生成Eigen
?
答案 0 :(得分:2)
我想出了一个更好的解决方案,它是std::vector
,Egien::Map
和std::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
。
您需要做的是:
以下代码应该可以解决问题,尽管您可以通过其他方式实现它。
//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
个不同的数字
通过以下步骤
从[0,p-t + 1]生成t
均匀分布的随机数idx[t]
对这些数字idx[t]
idx[i]+i, i=0,...,t-1
是结果
代码:
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;
}