2016-02-03 72 views
-2

我有一些笛卡爾點(即兩個值的陣列):如何修改數組的元素作爲矢量?

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

我需要在它做一些數學如(t+2)*p0或​​。我需要修改數組的每個元素。你會如何有效地做到這一點?我的代碼是這樣的:

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

但它看起來很糟糕的閱讀。有沒有更符合數學形式的更好的方法?

+1

什麼是't','m'和'v'?你期望的結果是什麼?你的示例代碼實際上並不修改數組,它會返回一個新的數組。 – Stefan

+1

在'(m/v + 2)/ p1'中,你正在用數組劃分某些東西。嗯。 –

+0

@CarySwoveland:不,我的意思是劃分數組內每個值的值。作爲乘法... – markzzz

回答

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] } 
2

怎麼樣

t = 1 # Or whatever value 
pT = p0.map do |p| 
    (t+2) * p 
end 
0

你可以這樣做如下:

pT = (t + 2) * p0.first, (t + 2) * p0.last 

你不需要周圍的右手邊表達式方括號,pT將兩個元素的數組。


如果你想讓它更類似於像笛卡爾點,那麼,你可以分別如下所示

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

然後別名Array#firstArray#lastArray#xArray#y,你可以使用:

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

使用"matrix" fr om標準庫。

require "matrix" 
p1 = Matrix.row_vector([20, 20]) # => Matrix[[20, 20]] 
3 * p1 # => Matrix[[60, 60]] 
+1

我仍然對使用[Matrix](http://ruby-doc.org/stdlib-2.2.3/libdoc/matrix/rdoc/Matrix.html)的方式感到驚訝。我希望你一讀到標題中的「矢量」就會想到它。 –

+0

最初沒有標題中的矢量。我通過編輯添加了它。原來的問題在語法上很糟糕。 – sawa

+1

...和[Vector](http://ruby-doc.org/stdlib-2.2.0/libdoc/matrix/rdoc/Vector.html)。 –