Tomasz Wegrzanowski wrote:
>
> Well, it's a very small thing, but tripple-dot makes is somewhat more 
> readable:

Good point.

>  sum_x = Array.new(x.size){0.0}
>  sum_x_sq = Array.new(x.size){0.0}
>  for i in 0..x.size-1
>    sum_x[i]    = x[i].inject(0) { |sum, e| sum + e }
>    sum_x_sq[i] = x[i].inject(0) { |sum, e| sum + e**2 }
>  end
> can be rewritten to:
>  sum_x = (0...x.size).map{|i| x[i].inject(0) { |sum, e| sum + e }}
>  sum_x_sq = (0...x.size).map{|i| x[i].inject(0) { |sum, e| sum + e**2 }}
> which looks a lot neater imho.

Agreed.

How about the (i,j) beasts?   E.g.,

   sum_xy = Array.new(x.size){ Array.new(y.size){0.0} }
   for k in 0..n-1
     for i in 0...x.size
       for j in 0...y.size
         sum_xy[i][j] += x[i][k]*y[j][k]
       end
     end
   end

Doubly embedded maps?

Is there anyway to do all this without using indices?

Maybe intercept the incoming vectors, build /scalar/
correlations for each variable combination, and then
assemble the final /matrix/ of correlations?

> It would look even neater to write:
>  sum_x = x.map{|xi| xi.sum}
>  sum_x_sj = x.map{|xi| xi.map{|e|e**2}.sum}
> but Ruby doesn't have Enumerable#sum by default.

Agreed.  I'm happy to locally extend Enumerable...

   module Enumerable
     def sum
       self.inject(0){ |sum,e| sum + e }
     end
   end

> Oh well, you have a few ideas of making the code nicer now :-)

Yes.  Thanks.

Regards,
--
Bil
http://fun3d.larc.nasa.gov