嗯,最近老闆要我幫他做個蒙地卡羅模擬(monte-carlo simulation),碰到陣列有限制的問題,然後老闆就想說如果不開陣列是否可以做binning,答案當然是可以~
不過一開始我寫的程式在做binning時需要判斷,原程式如下:
For i=0,ntot-1 do begin
    A=x1*y2-x2*y1
       for j=0,nbin-1 do begin
          if (A ge binning(j) and A lt binning(j)) then begin
              binning(j)=binning(j)+1
          endif
       endfor
Endfor
如果我有10^5個A要分做100個binning,所以我總共要跑兩個迴圈,花了10^5*100的單位時間,並且還要加上判斷的時間,所以不划算!
但老師後來教我一個方法,完全不用判斷,也不需要跑兩個迴圈,但他不告訴我程式怎麼寫:
剛剛看著老師給我的方法,試著自己寫寫看,也算是順利地寫出來了。
For i=0,ntot-1 do begin
    A=x1*y2-x2*y1
      q=fix(A/binsize)
      binning(q)=binning(q)+1
Endfor
兩行而已就搞定了。
 
說明一下方法:首先假設A=3.2,然後我要把A丟進我的binning裡面〈假設我從0~10,分成10個bins,所以binsize=1,也就是0~1為第一個bin,依次類推〉,怎麼做呢?
根據我原本的想法〈判斷〉就是我要知道A滿足某個條件之後,才會把A丟進binning裡面。
老師的方法是直接找出A在哪個bin裡面,也就是把A除於binsize然後取整數部份,依照上面的例子也就是(3.2/1)=3〈去掉小數部份〉,所以A在第三個bin裡面。
說的當然很簡單,但實際上我當初還在想說就算知道在哪個bin裡面,到最後還是要做統計,我又回到我的判斷想法...
來研究室之後想說試著寫寫看,看著老師在白板上的提示,就想到如果知道在哪個bin之後我就直接在binning的地方累加,也就是binning(3)=binning(3)+1,答案就出來了~~~
 
呼呼~又學到了一個好方法。
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 GKpen2 的頭像
    GKpen2

    美麗的星空

    GKpen2 發表在 痞客邦 留言(0) 人氣()