Map more than one array at once

W

Wil

Hi all,

I've been using Ruby for a while now, and have enjoyed it immensely.
However, I haven't yet found how to map more than one array at once.
The common example is calculating the dot product. You'd need to
iterate through each array at the same time to multiply the elements.
However, map only operates on one list at a time. I wanted to avoid
For Loops. Therefore, I end up having to do something like this
instead:

def dot_prod(a,b)
return 0 if a.length != b.length
c = []
a.each_with_index { |e, i| c << e * b }
c.inject { |e, t| t += e }
end

Ugly. or use recursion:

def dot_prod(a, b)
return 0 if a.length != b.length
a.empty? ? 0 : a.first * b.first + dot_prod(a[1..-1], b[1..-1])
end

Better, but a map/inject solution would be desired. Does anyone else
know of a way to iterate through two arrays without the use of an
index? Or do people just roll their own multiple array map function?
 
D

Daniel Lucraft

Wil said:
Hi all,

Better, but a map/inject solution would be desired. Does anyone else
know of a way to iterate through two arrays without the use of an
index?


def dot_prod(a, b)
acc = 0
a.zip(b) do |a1, b1|
acc += a1*b1
end
acc
end

best,
Dan
 
S

Stefano Crocco

Alle gioved=EC 19 luglio 2007, Wil ha scritto:
Hi all,

I've been using Ruby for a while now, and have enjoyed it immensely.
However, I haven't yet found how to map more than one array at once.
The common example is calculating the dot product. You'd need to
iterate through each array at the same time to multiply the elements.
However, map only operates on one list at a time. I wanted to avoid
For Loops. Therefore, I end up having to do something like this
instead:

def dot_prod(a,b)
return 0 if a.length !=3D b.length
c =3D []
a.each_with_index { |e, i| c << e * b }
c.inject { |e, t| t +=3D e }
end

Ugly. or use recursion:

def dot_prod(a, b)
return 0 if a.length !=3D b.length
a.empty? ? 0 : a.first * b.first + dot_prod(a[1..-1], b[1..-1])
end

Better, but a map/inject solution would be desired. Does anyone else
know of a way to iterate through two arrays without the use of an
index? Or do people just roll their own multiple array map function?


require 'generator'

a =3D [1, 2, 3]
b =3D ['a', 'b', 'c']
c =3D [:x, :y, :z]

s =3D SyncEnumerator.new( a, b, c)
s.each{|i| puts "first: #{i[0]}, second: #{i[1]}, third: #{i[3]}"}
=3D>=20
first: 1, second: a, third: x
first: 2, second: b, third: y
first: 3, second: c, third: z

To define the dot product:

def dot_prod(a,b)
raise ArgumentError unless a.size =3D=3D b.size
SyncEnumerator.new(a,b).inject(0){|res, i| res + i[0] * i[1]}
end

Stefano
 
D

Drew Olson

Wil said:
Hi all,

I've been using Ruby for a while now, and have enjoyed it immensely.
However, I haven't yet found how to map more than one array at once.
The common example is calculating the dot product.

Here's an example using inject, no need for a temp variable:

irb(main):001:0> def dot_prod a,b
irb(main):002:1> a.zip(b).inject(0) do |dp,(a,b)|
irb(main):003:2* dp + a*b
irb(main):004:2> end
irb(main):005:1> end
=> nil
irb(main):006:0> dot_prod([1,2,3],[4,5,6])
=> 32
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,819
Latest member
masterdaster

Latest Threads

Top