2017-07-19 99 views
0

我需要从正常分布的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和切断如果该值是比我的界限更高或更低。不知道这有多好,但它有效。

+0

你的代码在哪里?你有什么尝试? –

+0

没什么,因为我不知道如何开始。只尝试了'normrnd()'函数,但无法弄清楚如何在这里应用它。不幸的是,我的统计知识并不是最好的。 – herhuf

+1

你可能不会在这里得到很多帮助。通常情况下,问题包含特定项目,用户代码(努力)作为问题的一部分。 –

回答

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); 

从头开始建立它的八度:

你自制的建议有问题,如果实现是外面的束缚,将值设置到绑定值。因此,边界值将被过度比例选择。一种不那么肮脏的方式反而只是创造一个新的价值。我没有工作八度,但这样的事情应该这样做:

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 

正如一个警告:如果它是不可能的实现将在范围内,那么这可能很长一段时间运行...

+0

谢谢,不幸的是我实际上正在使用Octave,似乎'makedist'在这里还没有实现。 – herhuf

+0

@herhuf所以除了/ matlab标签,你应该在你的问题中使用'octave'。 – rahnema1

+0

那就是我刚刚做的。还是 - 谢谢你!这对我来说。 – herhuf

相关问题