【问题标题】:Sum arrays by index using functional programming使用函数式编程按索引对数组求和
【发布时间】:2015-02-27 18:09:21
【问题描述】:

我有几个大小相同的包含数字(矩阵)的数组,我想通过它们的索引(矩阵列)对它们进行求和。

例如,如果我有:

data = [[1, 2, 3, 4], [5, 6, 7, 8]]

我想得到结果:

column_totals = [6, 8, 10, 12]

我了解如何强制执行此操作,但我将如何使用函数式编程来执行此操作? (最好使用内置的 Enumerable 方法。)我对我提出的任何功能性解决方案都不是很满意。

我最终使用了 Matrix 类:

require 'matrix'

data = [[1, 2, 3, 4], [5, 6, 7, 8]]
matrix = Matrix[*data]
# Added sum method to Vector class.
matrix.column_vectors.map { |column| column.sum }

我对这个解决方案很满意,但我很沮丧,因为我无法在不依赖 Matrix 类的情况下围绕一个好的功能解决方案。

具体来说,我在转换这个步骤时被绊倒了:

data = [[1, 2, 3, 4], [5, 6, 7, 8]]

进入这个:

columns = [[1, 5], [2, 6], [3, 7], [4, 8]]

【问题讨论】:

  • 根据我对函数式编程的了解(不多),我认为Matrix 方法的使用是正确的。

标签: ruby arrays functional-programming


【解决方案1】:

有什么理由不使用Array#transpose

data.transpose
# => [[1, 5], [2, 6], [3, 7], [4, 8]]

或者,如果你只想使用Enumerable方法进行迭代,你可以这样做

columns = data.inject(Array.new(data.first.length){[]}) { |matrix,row|
  row.each_with_index { |e,i| matrix[i] << e }
  matrix }
# => [[1, 5], [2, 6], [3, 7], [4, 8]]

columns = data.flatten.group_by.with_index { |e,i| i % data[0].size }.values
# => [[1, 5], [2, 6], [3, 7], [4, 8]]

总结:

columns.map { |row| row.inject :+ }
# => [6, 8, 10, 12]

第三,如果你不需要中间的columns

data.inject { |s,r| s.zip(r).map { |p| p.inject :+ } }
# => [6, 8, 10, 12]

【讨论】:

    【解决方案2】:

    您可以使用Array#transpose,正如@Matt 所暗示的那样,然后对里面的数组求和:

    data.transpose.map {|a| a.reduce(:+) }
    

    【讨论】:

      猜你喜欢
      • 2018-03-13
      • 2011-04-06
      • 2014-01-31
      • 2022-01-16
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      相关资源
      最近更新 更多