From: William James Date: 2006-08-22T00:50:20+09:00 Subject: Re: You can write Fortran in any language Bil Kleb wrote: > Here is an example used for computing correlations. > It's almost a direct translation of several hundred > lines of Fortran 77. > > If you can bare to look, please help, even it is simply > to say "yo bonehead, why didn't you just require 'some_library'?" > > Thanks, > -- > Bil > http://fun3d.larc.nasa.gov > > > cat << EOF > correlation.rb > # Returns an array with correlation and y-normalized correlation^2 > # Assumes two nested arrays of variables and samples. For example, > # here's a case with 3 samples of 3 input variables and 2 output variables: > # > # x = [ [a1,a2,a3], [b1,b2,b3], [c1,c2,c3] ] > # y = [ [r1,r2,r3], [s1,s2,s3] ] > > def correlation(x,y) > > fail 'size arrays unequal' if x.first.size != y.first.size # lame > > n = x.first.size > > 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 sum_x = x.map{|a| a.inject(0){|sum,e| sum + e} } sum_x_sq = x.map{|a| a.inject(0){|sum,e| sum + e**2 } } > > sum_y = Array.new(y.size){0.0} > sum_y_sq = Array.new(y.size){0.0} > for i in 0..y.size-1 > sum_y[i] = y[i].inject(0) { |sum, e| sum + e } > sum_y_sq[i] = y[i].inject(0) { |sum, e| sum + e**2 } > end > > sum_xy = Array.new(x.size){ Array.new(y.size){0.0} } > for k in 0..n-1 > for i in 0..x.size-1 > for j in 0..y.size-1 > sum_xy[i][j] += x[i][k]*y[j][k] > end > end > end sum_xy = x.map{|xa| y.map{|ya| xa.zip(ya).inject(0){|sum,na| sum + na.first*na.last}}}