From: Stefano Crocco Date: 2007-07-20T01:55:37+09:00 Subject: Re: Map more than one array at once 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