从一系列正态分布的数字中选择

时间:2017-07-19 13:00:09

标签: matlab statistics octave normal-distribution

我需要从正常分布的0到1920像素的范围中选择一个像素,但我不知道如何在MatLab中执行此操作。我知道我可以使用normrnd()检索给定musigma的随机值,但如何将其应用于我的情况?

例如,

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并且如果值高于或低于我的界限则切断。不知道这有多好,但它确实有效。

1 个答案:

答案 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

正如警告:如果实现不可能在范围内,那么这可能会持续很长时间......