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

[dennou-ruby:000089] Re: gtrb & multi-D array



沼口です.

>> 負のインデックスが使えると、配列が前からも後ろからも対等にアクセ
>> スできるのが嬉しい。一方、差分を取ったりということから考えると、
>> i=0 で x[i-1] が nil 等にならないとバグの温床になるかもしれない。
>> 私としては、前者を重視して負のインッデクスが欲しいに一票。また、
>> rubyに組込みの配列クラス Array の負のインッデクス解釈と同じにな
>> るので、変えない方がユーザーの混乱が減るし、すっきりするとも思い
>> ます。

それはそれでわかるんですが,
私はサイクリックなものをきちんと表現できるかどうかを重視したいですね.
まぁ,このあたりは実際に作ってみてさらに議論しましょう.
でも,そんなに負のインデックスって使いますか?

>> それって、配列インデックスがいけない値だったら nil でなく、別の
>> を返すとかですか? 本当に必要でない限り避けたい様な気がします。

 > これについてはちょっと悩む所で、undef や NaN に相当するモノ
 > はあった方がよいやも知れません。ただ undef は予約語なので、

このあたりは,「ベクトル演算」の効率からいって,何かの処置が
あったほうがよいと思います.つまり if を減らす,ということに
対してです.

いちいち配列の範囲外参照があるかどうか最初にチェックして計算
するとなると,オブジェクト化のオーバーヘッドが大きくなって
しまいそうです.nil が出てきても平気で計算してくれて,必要な
ところでnil をチェックする,としたほうが効率的にはよいのでは?
ということです.

fortran なんかでベクトル計算機用のプログラムを組んでいると,
サイクリックな添字はしかるべく処理してくれて,配列からはみ出し
たら気にせず nil でも NaN でも返してくれ,そのままエラーとならずに
計算を続行してたらいいのに,と思うことがしばしばあります.
配列外参照を避けるため(だけ)に,わざわざ

   b[i,j] = a[i,min(j+1,jmax)]-a[i,max(j-1,0)]

などと書くのはしんどいと思いませんか?

もし,nil を含む演算の再定義がいやで,NaN を使うのなら,
配列をはみ出して参照した場合にも NaN が出てきてほしい.

-- 
沼口  敦@北海道大学大学院地球環境科学研究科 大気海洋圏環境科学専攻
tel:011-706-2365 fax:011-706-4865 〒060-0810 札幌市北区北10条西5丁目  
numa@xxxxxx