IDL提高程序運行效率

    前兩天跑了一個最短路徑,在找出需要搜索的點那放了兩個循環,因此大約2分鐘或者一分半出一張361*361的圖,其實搜索的範圍就這個圖的一半,我當時覺得已經算是在降低運行時間了,但是由於跑的實在太慢,而我畢設的數據量又很大,因此再進行改進。

    是想着把那兩個循環去掉,其實那兩個循環的目的很簡單就是找到distance數組裏最小的且沒有被搜索過的數,因此用了數組運算,將符合條件的像元都存在一個數組中,不符合條件的令爲999,然後在起始的時候定義一個min=999,這樣在後來得到最小值時,就可以直接比較了。剛開始不知道有ARRAY_INDICES這個函數可以識別多維數組的位置。所以當時只撤銷了一個循環,改用min()函數,時間變爲30s出一張圖,後來再把另一循環刪掉用ARRAY_INDICES,最後運行20s,我覺得在IDL中能用矩陣運算的一定要用啊,用不了用where,或者它自己自帶的函數,會快很多。要減少自己寫循環的次數。

修改後的一段代碼如下:

;找出最小且沒有搜索過的點
    minnumber=999.0
    mini=-1
    minj=-1
    right=mask
    right[*,*]=(search eq 0 and s ge index and mask eq 1)*1 ;這裏是找出符合條件的像元
    distemp=pdis
    distemp[*,*]=distemp*(right eq 1)+999*(right eq 0)
    minvalue=min(distemp,location)
    if minvalue lt minnumber then begin
      ind = ARRAY_INDICES(distemp, location)
      minnumber=minvalue
      mini=ind[0]
      minj=ind[1]
    endif

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章