在Ruby中,如何将一个数组中的每个元素与另一个数组中的每个元素相乘,使得结果为:
a = [1,2,3]
b = [4,5,6]
c = a*b = [4,5,6,8,10,12,12,15,18]
a = [1,2,3]
b = [4,5,6]
c = a*b = [4,5,6,8,10,12,12,15,18]
要得到一个良好的抽象,可以使用product
来获取笛卡尔积:
a.product(b).map { |aa, bb| aa * bb }
Enumerable#map_reduce
? :) - Aleksei Matiushkina.enum_for(:product, b)
。 - Aleksei Matiushkinzip
更糟糕 - 当给出一个块时,它只返回(无用的)nil
。 - Stefan这个解决方案利用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
...
arr = []
a.each { |aa| b.each { |bb| arr << aa*bb } }
arr
Matrix
方法?在Ruby中编写数值计算方法,如Matrix#lup_decomposition,这个想法让人难以置信。我原本以为会使用优化的公共领域矩阵库(带有Ruby包装器)来编写此类方法。那样做也比重新发明轮子容易得多。 - Cary Swoveland尝试以下操作:
a.product(b).map { |x| x.inject(&:*) }
a.map { |x| b.map(&x.method(:*)) }.flatten
(:*)
在你的第一个答案中,使用 flat_map
在你的第二个答案中。 - Sagar Pandyareduce
传递一个符号参数,因为这种方法只允许这样做,而使用 Symbol#to_proc
则是整个 Ruby 核心广泛采用的常见方法。 - Aleksei Matiushkin这可能不是很美观,但会返回你想要的结果。
a.map{|aa| b.map{|bb| bb * aa}}.flatten