我想在matlab中生成N维列向量,平均值为0.5(方差可以调整),但我希望所有数字都是正数,有人知道怎么做吗?
答案 0 :(得分:0)
这取决于您想要的分布。 rand(v)
函数在维度为[0,1]
的数组中生成一个统一的随机分布(范围v
我相信虽然我不确定0或1是理论上可能的值)。
因此,如果你想要一个3x4x5x6
数组,你可以做
myRandArray = rand([3 4 5 6]);
如果您希望较高的值更大,则可以执行
myRandArray = maxVal * rand([3 4 5 6]);
maxVal
是最大值。如果您想要范围minVal
到maxVal
,请执行
myRandArray = minVal + (maxVal - minVal) * rand([3 4 5 6]);
对于其他发行版(例如正常发布的randn
),您可以明显地对上述进行调整。如果您想要“截断的正态分布” - 您可能需要从太多的值开始:
dims = [3 4 5 6];
n = prod( dims );
tooMany = 0.5 + randn(2 * n); % since you want mean = 0.5
tooMany(tooMany < 0) = [];
if numel( tooMany ) > n
myRandArray = reshape(tooMany(1:n), dims);
end
你可以明显改善这一点,但这是一个普遍的想法。
例如,您只能生成n
个值,查看失败的数量(比如m),然后生成另一个m * n /(n - m),并根据需要重复,直到您确切地为n。< / p>
请注意,由于我们切断尾部,最终分布的平均值不再是0.5
。如果排除某些值,则“正态分布”不能保持“正常”。但是你没有指定你想要的分发......
答案 1 :(得分:0)
你可以试试这个:
E.g。创建一个从正态分布中抽取的1000个随机值的向量,平均值为0.5,标准差为5。
a = 5;
b = 0.5;
y = a.*randn(1000,1) + b;
为了使其成为正数,那么您可以删除所有负数或零的数字并生成更多数字,直到您得到n个正数。
查看here了解详情。