-------- Original-Nachricht --------
> Datum: Thu, 4 Oct 2007 00:39:09 +0900
> Von: Chris Bond <grnmoonanite / gmail.com>
> An: ruby-talk / ruby-lang.org
> Betreff: adding array of numbers

> Given a file that looks like so:
>   7                             ==> training Set length
>   11                            ==> file length
>   1  0  0  0  0  1  0       0
>   0  1  1  1  0  0  1       0
>   1  0  1  0  1  0  1       1
>   1  0  1  1  1  1  1       1
>   0  0  1  0  1  1  1       1
>   1  1  0  1  0  1  1       0
>   0  0  0  1  0  1  0       1
>   1  1  0  0  1  0  0       1
>   1  1  0  0  0  0  0       0
>   0  1  0  1  0  1  1       0
>   1  1  1  1  1  0  0       0 ==>end of file
>        #training set       #Answer
> For now, I need to do this : get the dotProduct of the vector training
> set and weight vector, and if that number is > 0 , output 1 ,else output
> 0. later in the problem I compare that to the answer, but I'm not there
> yet. Here is what I have(with tests) to try to get 1 training set to add
> up all numbers(without the dotProduct of weights) using IO.readlines,
> splitting each line using split,  for  loops to get an array of integers
> to be added together to get output for Perceptron_Bond object named
> einstein.  coding is as follows
> class Perceptron_Bond
> 
> attr_reader :weights, :output
> attr_writer :weights, :output
> def initialize(input, weights)
>   @weights = weights
>   @input =input
> end
> 
> 
>   def output
>      y = @input.inject(0) {|sum, element | sum+element}
>      @output=y
>      end
> end
>    str = ARGV[0]
>    inputs = Array.new
>    inputs1 = Array.new
>    inputsNum = Array.new
>    setArr = Array.new
>    answers = Array.new
>    arr = IO.readlines(str)
> 
> 
>    arr.shift
>    arr.shift
> 
>    arr.each { |y| inputs1.push(y.split)}
>    inputs1.each do|x|
>      answers.push(x.last)
>      x.pop
> end
>   for i in 0...inputs1.length
>   setArr[i]= Array.new
>   for j in 0...inputs1[i].length
>   inputsNum[j] = Array.new
>   inputsNum[j].push(Integer(inputs1[i][j]))
>   if j==(inputs1[i].length-1) then
>     inputs[i] = inputsNum
>     end
>   end
> puts inputs[i].to_s
> 
> end
> puts inputs.to_s
> puts inputs[2][1].class  ==> Array #i want fixnum
> 
>    initWeights = Array.new(inputs.length) { |index| index =0 }
>    einstein = Perceptron_Bond.new(inputs[0] , initWeights)
>    puts einstein.output  #should produce fixnum 2
> i get an error as well in output telling me I cannot coerce an Array to
> a fixnum
> Im guessing its stemming from the nested for loops I have, but I am just
> stumped
> I need help in a bad way, please.
> 
> Attachments:
> http://www.ruby-forum.com/attachment/524/somefile.rb
> 
> -- 
> Posted via http://www.ruby-forum.com/.

Dear Chris,

if I understand you correctly, a first problem is that you need
to get the scalar product of two vectors.

I'd like to suggest that you use GSL

http://www.gnu.org/software/gsl/

and its Ruby bindings ruby-gsl 

http://rb-gsl.rubyforge.org/

to do these manipulations - they have them implemented in C code,
so the actual computations are faster than in Ruby, besides the
fact that you don't have to recode everything by yourself.

I have written some code below to extract a matrix and the answer
vector from a file, and to calculate the dot product.

I think you can go on from there ... or just ask again :)


Best regards,

Axel


---------------------------------------------


require "gsl"

=begin

I assume that the file "dat.txt" contains

1  0  0  0  0  1  0       0
0  1  1  1  0  0  1       0
1  0  1  0  1  0  1       1
1  0  1  1  1  1  1       1
0  0  1  0  1  1  1       1
1  1  0  1  0  1  1       0
0  0  0  1  0  1  0       1
1  1  0  0  1  0  0       1
1  1  0  0  0  0  0       0
0  1  0  1  0  1  1       0
1  1  1  1  1  0  0       0 

=end

text=IO.readlines("dat.txt")
matrix_lines=[]
answer_vec=[]
text.each{|entry|
	s=entry.split(/ +/)
	matrix_lines<<s[0...-1].collect{|y|  eval(y).to_f}
	answer_vec<<eval(s[-1]).to_f
}


matrix=Matrix.alloc(matrix_lines.flatten,11,7)
answer_vec=Vector.alloc(answer_vec)
matrix_vector=Vector.alloc(matrix.column(0).to_a)

p matrix_vector.to_a
p answer_vec.to_a

# dot-product of the first column vector of the Matrix with answer
p matrix_vector*(answer_vec.col)


-- 
GMX FreeMail: 1 GB Postfach, 5 E-Mail-Adressen, 10 Free SMS.
Alle Infos und kostenlose Anmeldung: http://www.gmx.net/de/go/freemail