常規的「雲檢測」在計算「滑塊」的標準差的時候都是採用雙重迴圈的方式,逐行逐列的進行計算,這樣會導致速度很慢。本人提出一種快速計算矩陣「滑塊」標準差的方法。
需要讀者首先掌握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元素小的值,當兩個 記號 ...