2017-07-19 2 views
0

Je dois choisir un pixel d'une plage de, par exemple, de 0 à 1920 pixels avec la distribution normale, mais je n'ai aucune idée de la façon de le faire dans MatLab. Je sais que je peux utiliser normrnd() pour récupérer une valeur aléatoire donnée mu et sigma, mais comment puis-je l'appliquer à ma situation? Peut être à 500 pixels et sigma 100 pixels, par exemple.Choisir parmi une gamme de nombres avec une distribution normale

Mon approche actuelle est ce

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 

Je suis juste en utilisant normrnd et couper si la valeur est supérieure ou inférieure à mes limites. Je ne sais pas comment c'est bon, mais ça fonctionne.

+0

Où est votre code? Qu'avez-vous essayé? –

+0

Rien, parce que je ne sais pas comment commencer. Seulement essayé la fonction 'normrnd()', mais n'a pas pu comprendre comment l'appliquer ici. Mes connaissances en statistique ne sont malheureusement pas les meilleures. – herhuf

+1

Vous n'allez probablement pas obtenir beaucoup d'aide ici. Généralement, une question contient un élément spécifique, avec le code des utilisateurs (effort) dans le cadre de la question. –

Répondre

1

Au moment où vous avez lié une distribution normale (ou filtré ses résultats d'une autre manière), ce n'est plus une distribution normale. Cependant, il existe un truncated normal distribution qui est la chose la plus proche de ce que vous cherchez. Il a son propre ensemble de propriétés qui sont similaires à une distribution normale si les limites sont loin de la moyenne et vous avez une faible variance. Avec Matlab, vous pouvez faire cela avec:

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

Construire à partir de zéro pour Octave:

Votre proposition auto-a le problème que si une prise de conscience est en dehors de la limite, vous définissez la valeur à la limite valeur. Par conséquent, la valeur liée sera trop proportionnelle choisie. Un moyen moins sale est de simplement dessiner une nouvelle valeur. Je n'ai pas Octave de travail, mais quelque chose comme ça devrait le faire:

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 

Tout comme un avertissement: S'il est peu probable qu'une réalisation sera dans les limites, alors cela peut fonctionner pendant un temps très long ...

+0

Merci, malheureusement, je travaille actuellement avec Octave, et il semble que makedist ne soit pas encore implémenté ici. – herhuf

+0

@herhuf Donc en plus de/A la place de la balise 'matlab' vous devriez utiliser' octave' dans votre question. – rahnema1

+0

C'est ce que je viens de faire, aussi. Encore - merci! Cela le fait pour moi. – herhuf