在Ruby中,如何将一个数组中的每个元素乘以另一个数组中的每个元素,例如:
a = [1,2,3]
b = [4,5,6]
c = a*b = [4,5,6,8,10,12,12,15,18]
答案 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