我在Ruby中有一个类似[3,4,5]
的数组,我希望通过潜水或乘法来创建子数组。例如,我想将数组中的每个数字乘以2,3和4,返回[[6,9,12],[8,12,16],[10,15,20]]
在那之后,计算单位总数的最佳方法是什么?在此示例中,它将为9,而array.count
将返回3.
由于
答案 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]]