Multiplying array

W

WKC CCC

HI,

Does anyone know of a function that multiplies the contents of an array.
For example:

one = [1,2,3]
two = [[2],[3],[4]]

output = [[2],[6],[12]]

I've written a simple function that does this, however I'm sure there is
a better way, instead of casting the item to a float.

def multiplyArray(arr1,arr2)
newArr = []
i=0
arr1.each do |x|
x = x.to_s.to_f
item = arr2.to_s.to_f
ele = x * item
newArr.push(ele)
i = i + 1
end
puts newArr
end

Thanks,
 
R

Robert Klemme

Does anyone know of a function that multiplies the contents of an array.
For example:

one = [1,2,3]
two = [[2],[3],[4]]

output = [[2],[6],[12]]

I've written a simple function that does this, however I'm sure there is
a better way, instead of casting the item to a float.

Why do you cast to float? You can multiply integers directly.

First with a straightforward array "two":

irb(main):001:0> require 'enumerator'
=> true
irb(main):002:0> one = [1,2,3]
=> [1, 2, 3]
irb(main):003:0> two = [2,3,4]
=> [2, 3, 4]
irb(main):004:0> one.to_enum:)zip, two).map {|a,b| a*b}
=> [2, 6, 12]

Now with your array:

irb(main):005:0> two.map! {|i| }
=> [[2], [3], [4]]
irb(main):006:0> one.to_enum:)zip, two).map {|a,b| a * b[0]}
=> [2, 6, 12]

Kind regards

robert
 
A

ara.t.howard

HI,

Does anyone know of a function that multiplies the contents of an array.
For example:

one = [1,2,3]
two = [[2],[3],[4]]

output = [[2],[6],[12]]

I've written a simple function that does this, however I'm sure there is
a better way, instead of casting the item to a float.

def multiplyArray(arr1,arr2)
newArr = []
i=0
arr1.each do |x|
x = x.to_s.to_f
item = arr2.to_s.to_f
ele = x * item
newArr.push(ele)
i = i + 1
end
puts newArr
end

Thanks,


if you are doing lots of this then check out narray:

harp:~ > cat a.rb
require 'narray'

a = NArray.to_na [1,2,3]
b = NArray.to_na [2,3,4]

p( a * b )

harp:~ > ruby a.rb
NArray.int(3):
[ 2, 6, 12 ]

regards.

-a
 
P

Phrogz

WKC said:
Does anyone know of a function that multiplies the contents of an array.

module Enumerable
def product
inject{ |piece, prod| prod*piece }
end
def sum
inject(0){ |piece, total| total+piece }
end
end

a = (1..10)
p a.sum
#=> 55
p a.product
#=> 3628800
 
R

Rob Biedenharn

module Enumerable
def product
inject{ |piece, prod| prod*piece }
end
def sum
inject(0){ |piece, total| total+piece }
end
end

a = (1..10)
p a.sum
#=> 55
p a.product
#=> 3628800

module Enumerable
def product
inject(1) { |prod, piece| prod*piece }
end
def sum
inject(0) { |total, piece| total+piece }
end
end

True, except the block parameters were reversed. In these cases, the
final result wasn't affected because the operations are commutative.

I also added the argument to the inject within product for symmetry.
You could equally remove the 0 argument from the sum method's use of
inject.

-Rob

Rob Biedenharn http://agileconsultingllc.com
(e-mail address removed)
 
P

Phrogz

Rob said:
module Enumerable
def product
inject(1) { |prod, piece| prod*piece }
end
def sum
inject(0) { |total, piece| total+piece }
end
end

True, except the block parameters were reversed. In these cases, the
final result wasn't affected because the operations are commutative.

Man, I swear that every time I use #inject I get it backwards, and
think that I've fixed the answer in my mind for the next time. Thanks
for the correction. (Anyone got a good _why-like mnemonic they use for
remembering the order?)
I also added the argument to the inject within product for symmetry.
You could equally remove the 0 argument from the sum method's use of
inject.

I thought about that, but in my mind, the sum of an empty array is
zero, but the product of an empty array is nil (or 0?), not 1. Of
course, totally up the the OP as to how s/he wants to handle this edge
case.
 
P

Patrick Gundlach

[inject confusion]

(Anyone got a good _why-like mnemonic they use for
remembering the order?)

not good, but it helps me:

"memo" comes first (alphabetically), so it is

inject(memo, obj)


P.
 
P

Phrogz

WKC said:
How can the inject function work on 2 arrays?

It can't; I only read the first line of your post (which described a
single array) and rushed off my answer. As penance, I give you another
solution:

a = [ 1, 2, [3], [4], 5]
b = [ 6, [7], [8], 9, 10 ]

p a.flatten.zip(b.flatten).map{ |a,b| a*b }
#=> [6, 14, 24, 36, 50]
 
B

Bertram Scharpf

Hi,

Am Mittwoch, 24. Jan 2007, 01:57:36 +0900 schrieb Patrick Gundlach:
[inject confusion]
(Anyone got a good _why-like mnemonic they use for
remembering the order?)

not good, but it helps me:

"memo" comes first (alphabetically), so it is

inject(memo, obj)

I'm trying to help myself with the order invariance in

a == a.inject([]) { |r,e| r+[e] }
a == a.inject([]) { |r,e| r << e }

Bertram
 
W

William James

WKC said:
HI,

Does anyone know of a function that multiplies the contents of an array.
For example:

one = [1,2,3]
two = [[2],[3],[4]]

output = [[2],[6],[12]]

I've written a simple function that does this, however I'm sure there is
a better way, instead of casting the item to a float.

def multiplyArray(arr1,arr2)
newArr = []
i=0
arr1.each do |x|
x = x.to_s.to_f
item = arr2.to_s.to_f
ele = x * item
newArr.push(ele)
i = i + 1
end
puts newArr
end

Thanks,


[1,2,3].zip([2,3,4]).map{|a,b| a*b}
==>[2, 6, 12]
 

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,774
Messages
2,569,596
Members
45,143
Latest member
SterlingLa
Top