Stefano Crocco
7/19/2007 4:56:00 PM
Alle giovedì 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 != b.length
> c = []
> a.each_with_index { |e, i| c << e * b[i] }
> 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?
require 'generator'
a = [1, 2, 3]
b = ['a', 'b', 'c']
c = [:x, :y, :z]
s = SyncEnumerator.new( a, b, c)
s.each{|i| puts "first: #{i[0]}, second: #{i[1]}, third: #{i[3]}"}
=>
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 == b.size
SyncEnumerator.new(a,b).inject(0){|res, i| res + i[0] * i[1]}
end
Stefano