(Library) GPhys(加重)移動平均メソッド
作成者: 西本絵梨子
概要
2015-7-22(Wed) 追記
最新のGPhys (v1.4) には、インスタンスメソッドに移動平均(running_mean)が標準装備されています。そちらを使うのをおすすめします。
GPhys で 移動平均、加重移動平均を計算するインスタンスメソッドです。
ダウンロード
RunningMean.rb ライブラリ(2013/11/8版)。
依存ライブラリ
GPhys (電脳Rubyホームページを参照のこと)
使用方法
上記ファイルを同一ディレクトリもしくは、パスの通っているディレクトリに格納し、
require 'RunningMean'
でモジュールを読み込んで下さい。
インスタンスメソッド
NumRu::GPhys#running_mean(dim,nb,missing) => 移動平均
NumRu::GPhys#weighted_running_mean(dim,wgt,missing) => 加重移動平均
- dim: 移動平均をとる次元
- nb : 移動平均をとるデータ長
- wgt: 重み関数
- missing : データの両端 (nb-1)/2 個を欠損値とする (default=true)。経度方向に移動平均をかけるときなどは、missing=falseにすると cyclic も考慮した結果を返す。
ライブラリソース
require "numru/gphys/gphys"
module NumRu
class GPhys
def running_mean( dim, nb , missing=true )
wgt = NArray.sfloat(nb).fill(1.0/nb.to_f)
self.weighted_running_mean( dim, wgt , missing )
end
def weighted_running_mean( dim, wgt , missing=true )
dum = self.data.val
val = NArrayMiss.new( typecode , *shape ).fill(0.0)
dim = dim_index(dim) if dim.is_a?(String)
dim += rank if dim < 0
raise ArgumentError,"dim #{dim} does not exist" if dim<0 || dim>=rank
nb = wgt.length
nb_2 = (nb-1)/2 if nb%2 == 1
nb_2 = nb/2 if nb%2 == 0
kk = NArray.int(nb).indgen(-nb_2,1)
ki = 0
kk.each{|k|
mask = []
rank.times{|rr|
if rr==dim
mask << NArray.int(shape[dim]).indgen(k,1)%shape[dim]
else
mask << true
end
}
val += dum[*mask]*wgt[ki]
ki+=1
}
if missing
mask = []
rank.times{|rr|
if rr==dim
maskdum = NArray.int(nb_2).indgen.to_a
maskdum << NArray.int(nb_2).indgen(-1,-1).to_a
mask << maskdum.flatten
else
mask << true
end
}
val[*mask] = val[*mask].invalidation
end
to_ret = self.copy
to_ret.data.replace_val( val )
to_ret
end
end
end
キーワード:[GPhys] [拡張ライブラリ] [解析]
参照:[(Library) Butterworthローパスフィルター]