Hi.
I want to multply all elements of two arrays and add that to all
elements of
the third array like this:
c+=a*b
c=[1,1,1]
a=[2,2,2]
b=[3,3,3]
c=[7,7,7] # (1+2*3)=7
I tried (found on google):
a.zip(b).map {|i,j| i*j} (don’t really know how that works)
and how to add that to c array ?
Thanks
On Sun, Jun 7, 2009 at 4:15 PM, Haris Bogdanoviæ
[email protected] wrote:
I want to multply all elements of two arrays and add that to all elements of
the third array like this:
c+=a*b
c=[1,1,1]
a=[2,2,2]
b=[3,3,3]
c=[7,7,7] # (1+2*3)=7
How about a very simple each_index approach?
c.each_index { |i| c[i] += a[i] * b[i] }
=> [7, 7, 7]
Hope that helps,
Michael
On Sun, Jun 7, 2009 at 10:15 AM, Haris
Bogdanoviæ[email protected] wrote:
c=[7,7,7] # (1+2*3)=7
I tried (found on google):
a.zip(b).map {|i,j| i*j} (don’t really know how that works)
zip weaves two enumerables together and creates a new enumerable:
a.zip(b) # => [[2, 3], [2, 3], [2, 3]]
[[2, 3], [2, 3], [2, 3]].map {|i,j| i*j}
takes each sub-array, multiplies the two elements and returns a new
array with the products which produces [6, 6, 6]
and how to add that to c array ?
Just use zip and map again with a block which adds the elements.
c = c.zip(a.zip(b).map {|i, j| i*j}).map {|i, j|i + j}
Which changes the variable c to reference a new array which turns out
to be [7, 7, 7]
Rick DeNatale
Blog: http://talklikeaduck.denhaven2.com/
Twitter: http://twitter.com/RickDeNatale
WWR: http://www.workingwithrails.com/person/9021-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale
Rick DeNatale [email protected] wrote:
a=[2,2,2]
a.zip(b) # => [[2, 3], [2, 3], [2, 3]]
Just use zip and map again with a block which adds the elements.
c = c.zip(a.zip(b).map {|i, j| i*j}).map {|i, j|i + j}
Which changes the variable c to reference a new array which turns out
to be [7, 7, 7]
And if you’re going to be doing this kind of thing a lot, you might like
to generalize the repeated zip → map operation:
class Array
def combine(other, method)
zip(other).map {|x,y| x.send(method,y)}
end
end
c = [1,1,1]
a = [2,2,2]
b = [3,3,3]
c = a.combine(b, :*).combine(c, :+)
#=> [7,7,7]
I’m sure there’s a cleaner way… m.
Haris Bogdanoviæ wrote:
require ‘pp’
d=[]
a.each_with_index{|o, i| d[i] = a[i] + b[i] * c[i] };
pp d
On 07.06.2009 17:31, Rick DeNatale wrote:
On Sun, Jun 7, 2009 at 10:15 AM, Haris
Bogdanović[email protected] wrote:
a.zip(b).map {|i,j| i*j} (don’t really know how that works)
zip weaves two enumerables together and creates a new enumerable:
a.zip(b) # => [[2, 3], [2, 3], [2, 3]]
This is true only if you do not provide a block:
irb(main):007:0> a = Array.new 5 do |i| i end
=> [0, 1, 2, 3, 4]
irb(main):008:0> b = Array.new 5 do |i| i * 2 end
=> [0, 2, 4, 6, 8]
irb(main):009:0> a.zip(b) {|x,y| printf “%d - %d\n”,x,y}
0 - 0
1 - 2
2 - 4
3 - 6
4 - 8
=> nil
Kind regards
robert
On Sun, Jun 7, 2009 at 10:55 PM, Rha7 [email protected] wrote:
require ‘pp’
d=[]
a.each_with_index{|o, i| d[i] = a[i] + b[i] * c[i] };
pp d
Since you don’t use the ‘o’ block variable, you can also use
Array#each_index (which is what I used in my first reply to this
thread).
c.each_index { |i| c[i] += a[i] * b[i] }