如何将数组元素修改为向量?

时间:2016-02-03 14:23:36

标签: arrays ruby vector

我有一些笛卡尔点(即两个值的数组):

p0 = [0, 0]
p1 = [20, 20]

我需要对其进行一些数学计算,例如(t+2)*p0(m/v+2)/p1。我需要修改数组的每个元素。你会如何有效地做到这一点?我的代码是这样的:

pT = [(t + 2) * p0[0], (t + 2) * p0[1]]

但看起来很糟糕。是否有更好的方式更符合数学形式?

4 个答案:

答案 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#firstArray#last分别归结为Array#xArray#y,如下所示

class Array
    alias :x :first
    alias :y :last
end

然后,您可以使用:

pT = (t + 2) * p0.x, (t + 2) * p0.y