[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

adding, multiplying array

Haris Bogdanovi?

6/7/2009 2:13:00 PM

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


6 Answers

Michael Kohl

6/7/2009 3:24:00 PM

0

On Sun, Jun 7, 2009 at 4:15 PM, Haris Bogdanovi=E6
<haris.bogdanovic@gmail.com> wrote:
> I want to multply all elements of two arrays and add that to all elements=
of
> the third array like this:
>
> c+=3Da*b
>
> c=3D[1,1,1]
> a=3D[2,2,2]
> b=3D[3,3,3]
>
> c=3D[7,7,7] # (1+2*3)=3D7

How about a very simple each_index approach?

>> c.each_index { |i| c[i] +=3D a[i] * b[i] }
=3D> [7, 7, 7]

Hope that helps,
Michael

--=20
Blog: http://citiz...
Twitter: http://twitter.com/...

Rick DeNatale

6/7/2009 3:32:00 PM

0

On Sun, Jun 7, 2009 at 10:15 AM, Haris
Bogdanovi=E6<haris.bogdanovic@gmail.com> wrote:
> Hi.
>
> I want to multply all elements of two arrays and add that to all elements=
of
> the third array like this:
>
> c+=3Da*b
>
> c=3D[1,1,1]
> a=3D[2,2,2]
> b=3D[3,3,3]
>
> c=3D[7,7,7] =A0# (1+2*3)=3D7
>
> 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) # =3D> [[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 =3D 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]
--=20
Rick DeNatale

Blog: http://talklikeaduck.denh...
Twitter: http://twitter.com/Ri...
WWR: http://www.workingwithrails.com/person/9021-ric...
LinkedIn: http://www.linkedin.com/in/ri...

matt

6/7/2009 4:38:00 PM

0

Rick DeNatale <rick.denatale@gmail.com> wrote:

> On Sun, Jun 7, 2009 at 10:15 AM, Haris
> Bogdanovi?<haris.bogdanovic@gmail.com> wrote:
> > 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)
>
> 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]

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.


--
matt neuburg, phd = matt@tidbits.com, http://www.tidbits...
Leopard - http://www.takecontrolbooks.com/leopard-custom...
AppleScript - http://www.amazon.com/gp/product/...
Read TidBITS! It's free and smart. http://www.t...

Robert Klemme

6/7/2009 5:02:00 PM

0

On 07.06.2009 17:31, Rick DeNatale wrote:
> On Sun, Jun 7, 2009 at 10:15 AM, Haris
> Bogdanovic<haris.bogdanovic@gmail.com> 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

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestprac...

Rha7

6/7/2009 8:52:00 PM

0

Haris Bogdanoviæ wrote:
> 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
>
>

require 'pp'
d=[]
a.each_with_index{|o, i| d[i] = a[i] + b[i] * c[i] };
pp d

Michael Kohl

6/7/2009 9:36:00 PM

0

On Sun, Jun 7, 2009 at 10:55 PM, Rha7 <rha7.com@gmail.com> 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] }

--
Blog: http://citiz...
Twitter: http://twitter.com/...