From: Axel Etzold Date: 2007-10-04T01:13:55+09:00 Subject: Re: adding array of numbers -------- Original-Nachricht -------- > Datum: Thu, 4 Oct 2007 00:39:09 +0900 > Von: Chris Bond > 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<