(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

更新日時:2011/12/23 12:12:39
キーワード:[GPhys] [拡張ライブラリ] [解析]
参照:[(Library) Butterworthローパスフィルター]