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

[dennou-ruby:002396] Re: gpview, and max, min



堀之内です。

本来は NArray にそういう機能をつくるのがベストだと思うのですが、
それはそれとして、私も作ってみました。これが今のところ最短?
(竹広さん同様複数対応でやります. s が付くのは複数で配列)

idx1ds = gphys.val.eq(gphys.max).where
idxs = Array.new
idx1ds.each do |idx1d|
  idxs.push(idx=Array.new)
  gphys.shape.each_with_index{|len,d| idx1d,idx[d] = idx1d.divmod(len)}
end

> 竹広です. 
> 
> オジサンも四十の手習いでちょっと試してみました. 
> where がヒットする場所が複数ある場合を想定してます. 
> でもあってんのかな? 添字の付き方が 0 からの場合は
> 慣れてないので不安. だれか採点して. 
> 
> idx1d = gphys.val.eq(gphys.max).where
> 
> idx1d.each{|idx|
>   idx_array = Array.new(rank,0)
>   i=rank
>   while i > 1 do
>     i -= 1
>     interval = 1
>     shape[0..i-1].each{|dim|
>       interval *= dim
>     }
>     idx_array[i], idx = idx.divmod(interval)
>   end
>   idx_array[0]=idx
>   ...
> }
> 
> 
> > whereメソッドは多次元配列を一次元配列とおもった時の添え字を返すみたいな
> > ので、ちょっと汚いですが、こんな感じで。。。
> > 
> > #いろいろ変数名がいまいちですが。
> > 
> >   idx = gp.val.eq(gp.max).where
> >   shape = gp.shape
> >   idx_array = Array.new
> > 
> >   (gp.shape.size - 1).times do |i|
> >     shape.pop
> >     num = 1
> >     shape.each do |s|
> >       num = num * s
> >     end
> >     idx_array.push( idx / num )
> >     idx = idx - num * idx_array[-1]
> >   end
> >   idx_array.push( idx % shape[0] )
> >   idx_array.reverse 
> > 
> > idx_arrayに各次元の添え字が入るはずです。
> > 
> > #15行もあるなぁ。もっと短くならないですかねぇ。
> 

Takeshi Horinouchi  --  horinout@xxxxxxxxxxxxxxxxxx
Research Institute for Sustainable Humanosphere
Kyoto Univ., Uji, 611-0011, Japan
phone:+81-774-38-3812  fax:+81-774-31-8463