我有一些笛卡尔点(即两个值的数组):
p0 = [0, 0]
p1 = [20, 20]
我需要对其进行一些数学计算,例如(t+2)*p0
或(m/v+2)/p1
。我需要修改数组的每个元素。你会如何有效地做到这一点?我的代码是这样的:
pT = [(t + 2) * p0[0], (t + 2) * p0[1]]
但看起来很糟糕。是否有更好的方式更符合数学形式?
答案 0 :(得分:2)
.map
怎么样?
pT = [p0, p1].map { |p| (t + 2) * p }
如果您需要为每个值应用一堆组合函数,您可以执行以下操作:
funcs = [
proc { |p| (t + 2) * p }, # f
proc { |p| (m / v + 2) / p } # g
]
# applies g(f(p)) for each p
pT = [p0, p1].map { |p| funcs.inject(p) { |p, f| p = f[p] } }
如果您需要为每个值使用不同的函数,请更进一步:
funcs = [
proc { |p| (t + 2) * p },
proc { |p| (m / v + 2) / p },
proc { |p| p }
]
pT = [p0, p1].zip(funcs).map { |p, f| f[p] }
答案 1 :(得分:2)
怎么样
t = 1 # Or whatever value
pT = p0.map do |p|
(t+2) * p
end
答案 2 :(得分:2)
使用标准库中的SyncedCron.add
。
"matrix"
答案 3 :(得分:0)
您可以执行以下操作:
pT = (t + 2) * p0.first, (t + 2) * p0.last
右侧表达式周围不需要方括号,pT
将是两个元素的数组。
如果您希望它更像笛卡尔点,那么您可以将Array#first
和Array#last
分别归结为Array#x
和Array#y
,如下所示
class Array
alias :x :first
alias :y :last
end
然后,您可以使用:
pT = (t + 2) * p0.x, (t + 2) * p0.y