2017-07-19 98 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

相關問題