(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ローパスフィルター]