# Adding array of numbers

**URL:** <https://www.ruby-forum.com/t/adding-array-of-numbers/116231>\
**Category:** Ruby\
**Created:** [October 3, 2007, 5:39pm UTC](https://www.ruby-forum.com/t/adding-array-of-numbers/116231 "2007-10-03T17:39:05Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![dacbo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/b9e5f3/32.png) [@dacbo](https://www.ruby-forum.com/u/dacbo)\
**Post date:** [October 3, 2007, 5:39pm UTC](https://www.ruby-forum.com/t/adding-array-of-numbers/116231/1 "2007-10-03T17:39:05Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![dacbo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/b9e5f3/32.png) [@dacbo](https://www.ruby-forum.com/u/dacbo)\
**Post date:** [October 3, 2007, 6:14pm UTC](https://www.ruby-forum.com/t/adding-array-of-numbers/116231/2 "2007-10-03T18:14:31Z")

</div>

-------- Original-Nachricht --------

> Datum: Thu, 4 Oct 2007 00:39:09 +0900  
> Von: Chris B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> An: removed\_email\_address@domain.invalid  
> Betreff: adding array of numbers

> 1 1 0 0 1 0 0 1  
> to be added together to get output for Perceptron\_Bond object named
> 
> answers = Array.new  
> end
> 
> stumped  
> I need help in a bad way, please.
> 
> Attachments:  
> [http://www.ruby-forum.com/attachment/524/somefile.rb](http://www.ruby-forum.com/attachment/524/somefile.rb)
> 
> –  
> Posted via [http://www.ruby-forum.com/](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/](http://www.gnu.org/software/gsl/)

and its Ruby bindings ruby-gsl

[http://rb-gsl.rubyforge.org/](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)

---

<div class="post-metadata">

**Author:** ![dacbo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/b9e5f3/32.png) [@dacbo](https://www.ruby-forum.com/u/dacbo)\
**Post date:** [October 4, 2007, 3:13pm UTC](https://www.ruby-forum.com/t/adding-array-of-numbers/116231/3 "2007-10-04T15:13:52Z")

</div>

2007/10/3, Chris B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> 1 1 0 0 1 0 0 1  
> to be added together to get output for Perceptron\_Bond object named
> 
> answers = Array.new  
> end
> 
> stumped  
> I need help in a bad way, please.
> 
> Attachments:  
> [http://www.ruby-forum.com/attachment/524/somefile.rb](http://www.ruby-forum.com/attachment/524/somefile.rb)

I am not sure whether I understood properly which of the vectors you  
want to multiply with which ones. Is this what you want?

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![dacbo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/b9e5f3/32.png) [@dacbo](https://www.ruby-forum.com/u/dacbo)\
**Post date:** [October 4, 2007, 10:46pm UTC](https://www.ruby-forum.com/t/adding-array-of-numbers/116231/4 "2007-10-04T22:46:40Z")

</div>

On Oct 3, 2007, at 9:39 AM, Chris B. wrote:

> 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

not answering your question, but you _really_ want to be using NArray

[http://narray.rubyforge.org/](http://narray.rubyforge.org/)

kind regards.

a @ [http://drawohara.com/](http://drawohara.com/)

---

<div class="post-metadata">

**Author:** ![dacbo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/b9e5f3/32.png) [@dacbo](https://www.ruby-forum.com/u/dacbo)\
**Post date:** [October 4, 2007, 7:58pm UTC](https://www.ruby-forum.com/t/adding-array-of-numbers/116231/5 "2007-10-04T19:58:04Z")

</div>

Robert K. wrote:

> 2007/10/3, Chris B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > 1 1 0 0 1 0 0 1  
> > to be added together to get output for Perceptron\_Bond object named
> > 
> > answers = Array.new  
> > end
> > 
> > stumped  
> > I need help in a bad way, please.
> > 
> > Attachments:  
> > [http://www.ruby-forum.com/attachment/524/somefile.rb](http://www.ruby-forum.com/attachment/524/somefile.rb)
> 
> I am not sure whether I understood properly which of the vectors you  
> want to multiply with which ones. Is this what you want?
> 
> Kind regards
> 
> robert

The problem was to make a perceptron learning algorithm. you take the 1  
1 0 0 1 0 0 string then initially multiply it by the weight vector  
of all 0s. The output is the dot product of the two vectors. Then you  
compare that output to the answers that are on the right. If the  
perceptron did not fire(0), when it should have, you add the dot product  
to the old weight vector, and the converse(1 when it should be 0) you  
subtract  
here is the speudocode  
w= random vector  
repeat  
Get input x  
Get neuron output y = (1 if w â‹… x â‰¥ 0; otherwise 0)  
Find correct output y#  
Compute error e= y# âˆ’ y  
If e â‰ 0  
w= w + ex  
until w stops changing

hope that helps

---

<div class="post-metadata">

**Author:** ![dacbo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/b9e5f3/32.png) [@dacbo](https://www.ruby-forum.com/u/dacbo)\
**Post date:** [October 12, 2007, 9:30pm UTC](https://www.ruby-forum.com/t/adding-array-of-numbers/116231/6 "2007-10-12T21:30:04Z")

</div>

ok, so I got the thing to work, with just arrays, but now i want to ask  
the user if he/she wants to go through the set again, with ‘yes’ and  
‘no’ as the values, and what I end up with is an infinite loop.

while gets != ‘no’  
einstein.input.each\_index { |x| einstein.c\_weights(einstein.input[x],  
einstein.weights, matrix\_ans[x][0]) }  
end

I was wandering if having the ARGV[0] as the filename has anything to do  
with it.
