将数组中的每个项目乘以另一个数组中的每个项目

时间:2018-12-11 05:00:22

标签: arrays ruby

在Ruby中,如何将一个数组中的每个元素乘以另一个数组中的每个元素,例如:

a = [1,2,3]

b = [4,5,6]

c = a*b = [4,5,6,8,10,12,12,15,18]

4 个答案:

答案 0 :(得分:10)

要获得更好的抽象效果,可以使用product获得笛卡尔积:

a.product(b).map { |aa, bb| aa * bb }

答案 1 :(得分:4)

该解决方案利用Matrix方法来计算(然后展平)两个向量的外积

require 'matrix'

(Matrix.column_vector(a) * Matrix.row_vector(b)).to_a.flatten
  #=> [4, 5, 6, 8, 10, 12, 12, 15, 18]

与迄今为止的其他两个答案一样,这将生成一个临时数组,该数组在展平时(如果尚未展平)包含a.size**2元素。如果a太大而导致存储问题,则可以使用一对枚举数代替:

a.each_with_object([]) { |aa,arr| b.each { |bb| arr << aa*bb } }
  #=> [4, 5, 6, 8, 10, 12, 12, 15, 18]

枚举数如下。

enum_a = a.each_with_object([])
  #=> #<Enumerator: [1, 2, 3]:each_with_object([])>
aa, arr = enum_a.next
  #=> [1, []]
aa, arr = enum_a.next
  #=> [2, []]
...

enum_b = b.each
  #=> #<Enumerator: [4, 5, 6]:each>
bb = enum_b.next
  #=> 4
bb = enum_b.next
  #=> 5
...

请参见Enumerator#next。这就是枚举器将元素传递到其块的方式。

方法Enumerable#each_with_object非常方便,并不像最初看起来的那样复杂。在大多数情况下,它只保存以下两行代码。

arr = []
a.each { |aa| b.each { |bb| arr << aa*bb } }
arr

答案 2 :(得分:1)

尝试以下,

a.product(b).map { |x| x.inject(&:*) }

令人惊奇的是,下面的问题也可以解决

a.map { |x| b.map(&x.method(:*)) }.flatten

答案 3 :(得分:-3)

这并不漂亮,但会返回您想要的内容。

a.map{|aa| b.map{|bb| bb * aa}}.flatten