我有几个同样大小的数组包含号码 (矩阵),并且我想要它们加总所有通过它们的索引 (矩阵列)。

例如,如果我有︰

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

我想要得到的结果︰

column_totals = [6, 8, 10, 12]

我知道如何执行此操作以命令的方式,但我如何做到这样使用函数式编程?(最好使用内置的可枚举方法。)我不是任何功能的解决方案,我提出了非常满意的。

我最终使用的矩阵类︰

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 }

我很高兴通过该解决方案,但失望,我无法而不依赖于矩阵类包装我注意解决好功能完整的解决方案。

具体来说,我是踢的位置转换这一个步骤上︰

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

为此︰

columns = [[1, 5], [2, 6], [3, 7], [4, 8]]
2014-12-31 00:00:00
问题评论:

从我知道的函数编程 (不多),我会认为使用Matrix方法是 spot-on。

回答:

任何理由不使用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]

可以使用Array#transpose,如 @Matt 提示,并再求和中的阵列︰

data.transpose.map {|a| a.reduce(:+) }
请输入您的翻译

Sum arrays by index using functional programming

确认取消