通过在ruby中执行算术函数来拆分数组

时间:2014-04-21 22:06:22

标签: ruby arrays

我在Ruby中有一个类似[3,4,5]的数组,我希望通过潜水或乘法来创建子数组。例如,我想将数组中的每个数字乘以2,3和4,返回[[6,9,12],[8,12,16],[10,15,20]]

在那之后,计算单位总数的最佳方法是什么?在此示例中,它将为9,而array.count将返回3.

由于

2 个答案:

答案 0 :(得分:3)

我能想到的最简单的方法是:

[3,4,5].map { |v|
    [3,4,5].map { |w|
        w * v
    }
}

我确信有更优雅的方式。

至于计数,您可以使用flatten将其转换为包含所有元素的单个数组。

[[9, 12, 15], [12, 16, 20], [15, 20, 25]].flatten
 => [9, 12, 15, 12, 16, 20, 15, 20, 25] 

答案 1 :(得分:2)

您可能会发现使用矩阵运算很方便,特别是如果它是几个涉及矩阵,向量和/或标量之间的一步。

<强>代码

require 'matrix'

def doit(arr1, arr2)
   (Matrix.column_vector(arr2) * Matrix.row_vector(arr1)).to_a
end

def nbr_elements(arr1, arr2) arr1.size * arr2.size end

<强>实施例

arr1 = [3,4,5]
arr2 = [3,4,5]

doit(arr1, arr2)
  #=> [[ 9, 12, 15],
  #    [12, 16, 20],
  #    [15, 20, 25]]

nbr_elements(arr1, arr2)
  #=> 9

doit([1,2,3], [4,5,6,7])
  #=> [[4,  8, 12],
  #    [5, 10, 15],
  #    [6, 12, 18],
  #    [7, 14, 21]]

nbr_elements([1,2,3], [4,5,6,7])
  #=> 12

<强>替代

如果您不想使用矩阵运算,可以这样做:

arr2.map { |e| [e].product(arr1).map { |e,f| e*f } }

以下是一个例子:

arr1 = [1,2,3]
arr2 = [4,5,6,7]

arr2.map { |e| [e].product(arr1).map { |e,f| e*f } }
  #=> [[4,  8, 12],
  #    [5, 10, 15],
  #    [6, 12, 18],
  #    [7, 14, 21]]