[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:003665] Re: GPhys#cyclic_ext の拡張



神代さま

> サブセットを取る場合, たとえば0-360度でデータが格納されているとき
> に, 0度をまたいだ領域を取りたいことがよくあって, 困ります.
> これを簡単にできるように, ...

提案ありがとうございます。需要はよくわかります。
(現状でも数行でできますが,一発でできるように
したいですね。できれば cut が自動的に対応してれるのが
いいのではないでしょうか。)

今回の実装案は,[0, 360) のデータを例えば 270〜450度として切り出
すお膳立て( [0, 720) への拡張だけ) をサポートするということですよね。
でも,そもそも 270〜450度としてでなく -90〜90度として切り出したく
ないですか。(それはサポートしてないですね。)

望ましい方向性についてちょっと考えてみました。

筋がよいのは Axis クラスで対応することだろうと
思います。cut の cyclic 対応版をつくり,
self.cyclic_extendible? で (ここで self は Axis オブジェクト),
cut 指定が1点(Numeric)または範囲 (Range) なら
そっちを使うようにする(cutメソッドに直接サイクリック対応を
書き足すとコードがごちゃごちゃしそうなので適宜下請けを作って分離す
るのが良い気がします。実装は Axis#modulo を使ってよろしくやる)。

# 参考例: lib/numru/gphys/derivative.rb l.124 ( __deriv メソッド)

おそらくこれだけで GPhys#cut は cyclic な場合に対応するよう
になると思いますが,どうでしょう。

ちなみに cyclic_extendible? を使う場合の制限事項は,もとの格子が,
あと1点伸ばせばちょうど一周という場合しか true にならないという
ことです。この制限があると実装は簡単になりますが,例えばすでに2
周分に伸びてるデータは扱えない。これに対応するのも難しくはないで
しょうが,まあいいですかね。

なお,今見ると Axis#cyclic? , Axis#cyclic_extendible? 
の実装は変えたほうがいいと思いますが,あくまでその中身の
話なので,使うのは問題ないはずです。

GPhys#cyclic_ext は描画のための方便としてわりと初期に作ったもので,
あとから Axis に cyclic? 等のメソッドを作った際に書き直すべ
きでした(です)。ちゃんとそうしてれば GPhys#cyclic_ext を
拡張しようとは思わなかったでしょうね。すみません。

> 堀之内さま, みなさま:
> 
> 神代です.
> 
> 以前他の方からも要望があったような気がしますが, GPhysで経度方向に
> サブセットを取る場合, たとえば0-360度でデータが格納されているとき
> に, 0度をまたいだ領域を取りたいことがよくあって, 困ります.
> これを簡単にできるように, cyclic_ext メソッドを拡張したらどうかな
> と思いました.
> 
> cyclic_ext の最後にいくつ伸ばすかの引数を新しく加えます. デフォル
> トを1にしておけば, 既存プログラムの変更は不要です.
> 実用的には, 単純に2倍の範囲にする cyclic_ext2 を用意しておいて,
> それをさらに cut で経度範囲指定, という感じで使えば, あまり悩まず
> にさくっとできるかなと思います.
> 
> そのように実装してみたパッチを添付します. いかがでしょうか...?
> 
> --
> 神代 剛 (こうしろ つよし)
> 気象研究所気候研究部第四研究室 支援研究員
> 

堀之内 武
北海道大学 地球環境科学研究院 地球圏科学部門
〒060-0810 札幌市北区北10条西5丁目