Matlab - 高浓度1s(或0s)的二元向量

时间:2010-03-30 23:11:17

标签: matlab random

生成大小为N的随机二进制向量X的最佳方法是什么,其浓度为1s(或同步,0s),从非常低到非常高?

使用randint或unidrnd(如this question中所示)将生成具有均匀分布的二元向量,这不是我在这种情况下所需要的。

任何帮助表示赞赏!

4 个答案:

答案 0 :(得分:6)

Laserallan的方法是可行的方法。

对于具有10个元素和70%随机分布的向量,您可以编写

randVec = rand(10,1)<0.7;

编辑如果你想要长度为N的X向量,随着数量的增加,你就写了

thresVec = linspace(0,1,X);  %# thresholds go from 0 (all 0) to 1 (all 1)  
randVec = bsxfun(@lt,rand(N,X),threshVec); %# vectors are per column

请注意,randVec是一个逻辑数组。根据你想要用它做什么,你可能希望将它转换为双倍的

randVec = double(randVec);

答案 1 :(得分:3)

我不是matlab的专家,但实现起来非常简单的方法是生成浮点随机数的向量(最好在1到0的范围内),然后将高于某个阈值的值设置为1和低于0。 假设您想要30%的值,则将所有值设置为.7到1以及低于0的值。

答案 2 :(得分:2)

使用

rand(N,1)<p   %# 0 < p < 1

会给你一个Nx1向量,其中平均 N * p个(其他地方将为零) - 但是在某些运行中你可能会得到一个与你期望的不同的向量(它可能全部为零......可能是一个非常低的机会,但仍然是非零的机会)。

如果你想要完全 A和B零,你可以这样做:

rand_vec = [ones(A, 1); zeros(B, 1)];
rand_vec = rand_vec(randperm(A+B));

然后您可以设置A和B以满足您的需求。

修改
现在我更了解你的问题: 假设你有一个向量p,其中包含人口中1的所需比例,N是每个向量中元素的数量。

rand_mat = rand(N, size(p,2)) < repmat(p', [1,N])';

会给你一个Nx(大小(p,2))矩阵,其中列i是一个p(i)的向量(平均如上所述),其余为零。

答案 3 :(得分:1)

你可以对均匀分布的二进制向量使用位或运算,我怀疑你最终得到的确切分布会有点复杂。