IDL 一種用來快速優化「雲檢測」速度的方法

2021-10-04 19:49:26 字數 2779 閱讀 8239

常規的「雲檢測」在計算「滑塊」的標準差的時候都是採用雙重迴圈的方式,逐行逐列的進行計算,這樣會導致速度很慢。本人提出一種快速計算矩陣「滑塊」標準差的方法。

需要讀者首先掌握im2col方法:

;im2col函式

function fun_col2im, column, input_shape, filter_h, filter_w, stride=stride, pad=pad

param_number = n_params(

) if param_number eq 4 then begin

w= input_shape[0]

h = input_shape[1]

out_h = floor(

(h +

2*pad - filter_h)

/ stride )+1

out_w = floor(

(w +

2*pad - filter_w)

/ stride )+1

column = reform(column,

[out_w, out_h, filter_w, filter_h]

); column = transpose(column,[2

,3,0

,1])

img = fltarr(w +

2*pad + stride -

1, h +

2*pad + stride -1)

for x =

0, filter_w-

1 do begin

x_max = x + stride*out_w

for y =

0, filter_h-

1 do begin

y_max = y + stride*out_h

;print

, x, x_max, y, y_max

img[x:x_max-

1:stride, y:y_max-

1:stride]

= column[*,

*, x, y]

endfor

endfor

end_w = w -

1+ pad

end_h = h -

1+ pad

return, img[pad:end_w, pad:end_h]

endif else begin

print,

"function params is not enough!"

return,

0 endelse

endpro im2col

;為了進行模擬,我們根據0.01°的解析度,建立乙個3600

*1800的隨機數組

input_data = randomn(undefinevar,

3600

,1800

) filter_h =

3 filter_w =

3 stride=

1 pad=

0 start = systime(

/second)

column = fun_im2col(input_data, filter_h, filter_w, stride=

1, pad=0)

out_w = floor(

(3600+2

*pad - filter_h)

/ stride )+1

out_h = floor(

(1800+2

*pad - filter_w)

/ stride )+1

m = stddev(column, dimension=2)

m = reform(m,

[out_w, out_h]

) endtime = systime(

/second)

print,

'running time '

,endtime-start

end

執行時間為2.2576秒

% compiled module: test.

running time 2.5769999

我們再來看一下採用雙重迴圈的耗時

m = fltarr(

3600-2

,1800-2

) start = systime(

/second)

input_data = randomn(undefinevar,

3600

,1800

) for x =0,

3600

-3 do begin

for y =0,

1800

-3 do begin

m[x, y]

= stddev( input_data[x:x+

2, y:y+2]

) endfor

endfor

endtime = systime(

/second)

print,

'running time '

,endtime-start

可以看出迴圈耗時很長, 所以基於im2col方法計算「滑塊」標準差或者其他統計量是一種非常快速的方法!

% compiled module: test.

running time 93.859000

一種快速排序演算法

using system class program for int l 0 l src.length l src count temp l i 3 0xff temp l static void main string args watch.stop console.writeline quick...

快速排序的一種實現

閒來沒事,寫了乙個程式玩玩,省的到時候會了shell,又不會c的程式設計了 手動痛哭 本著簡明的原則,選取的標準數是在陣列的 開頭 或者 結尾處 這裡需要注意,如果你選擇的基準數是在左側,那麼就需要從右側開始遍歷陣列 從右側選取的基準數也是同理。include include include usi...

快排與一種優化

快速排序 quick sort 是計算機領域乙個重要的演算法。初學快排,理解起來並不難,核心理念主要是選取pivot軸心元素 選取pivot元素也有一定技巧,可能會影響到演算法的複雜度,需要多加揣摩 再從左向右尋找第乙個比pivot元素大的值,從右向左尋找第乙個比pivot元素小的值,當兩個 記號 ...