我需要从正常分布的0到1920像素的范围中选择一个像素,但我不知道如何在MatLab中执行此操作。我知道我可以使用normrnd()
检索给定mu
和sigma
的随机值,但如何将其应用于我的情况?
mu
可能为500像素,sigma
为100像素。
我目前的做法是这个
function xpos = apply_normal_distribution(mu, sigma, min_xpos=1, max_xpos=1920)
% Applies normal distribution with median mu and standard deviation sigma
% xpos will always be: min <= xpos <= max
xpos = ceil(normrnd(mu, sigma));
if xpos > max_xpos
xpos = max_xpos;
elseif xpos < min_xpos
xpos = min_xpos;
endif
end
所以我只是使用normrnd
并且如果值高于或低于我的界限则切断。不知道这有多好,但它确实有效。
答案 0 :(得分:1)
当您绑定正态分布(或以任何其他方式过滤其结果)时,它不再是正态分布。但是,存在truncated normal distribution,它与您正在寻找的最接近。它有自己的一组属性,类似于正态分布如果边界远离均值并且你的方差很小。使用Matlab,您可以使用:
mu = 500;
sigma = 100;
%truncate at 0 and 1920
pd = truncate(makedist('Normal',mu,sigma),0,1920);
% take some (10) samples
samples = random(pd,10,1);
从头开始构建Octave:
您自制的提案存在的问题是,如果实现超出范围,则将值设置为绑定值。因此,边界值将选择过度成比例。一种不那么肮脏的方式只是绘制一个新的价值。我没有工作的Octave,但是这样的事情应该这样做:
function xpos = apply_normal_distribution(mu, sigma, min_xpos=1, max_xpos=1920)
% new realisations are drawn as long as they are outside the bounds.
while xpos<min_xpos | xpos>max_xpos
xpos = ceil(normrnd(mu, sigma));
end
end
正如警告:如果实现不可能在范围内,那么这可能会持续很长时间......