我有一些笛卡爾點(即兩個值的陣列):如何修改數組的元素作爲矢量?
p0 = [0, 0]
p1 = [20, 20]
我需要在它做一些數學如(t+2)*p0
或。我需要修改數組的每個元素。你會如何有效地做到這一點?我的代碼是這樣的:
pT = [(t + 2) * p0[0], (t + 2) * p0[1]]
但它看起來很糟糕的閱讀。有沒有更符合數學形式的更好的方法?
我有一些笛卡爾點(即兩個值的陣列):如何修改數組的元素作爲矢量?
p0 = [0, 0]
p1 = [20, 20]
我需要在它做一些數學如(t+2)*p0
或。我需要修改數組的每個元素。你會如何有效地做到這一點?我的代碼是這樣的:
pT = [(t + 2) * p0[0], (t + 2) * p0[1]]
但它看起來很糟糕的閱讀。有沒有更符合數學形式的更好的方法?
.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] }
怎麼樣
t = 1 # Or whatever value
pT = p0.map do |p|
(t+2) * p
end
你可以這樣做如下:
pT = (t + 2) * p0.first, (t + 2) * p0.last
你不需要周圍的右手邊表達式方括號,pT
將兩個元素的數組。
如果你想讓它更類似於像笛卡爾點,那麼,你可以分別如下所示
class Array
alias :x :first
alias :y :last
end
然後別名Array#first
和Array#last
到Array#x
和Array#y
,你可以使用:
pT = (t + 2) * p0.x, (t + 2) * p0.y
使用"matrix"
fr om標準庫。
require "matrix"
p1 = Matrix.row_vector([20, 20]) # => Matrix[[20, 20]]
3 * p1 # => Matrix[[60, 60]]
我仍然對使用[Matrix](http://ruby-doc.org/stdlib-2.2.3/libdoc/matrix/rdoc/Matrix.html)的方式感到驚訝。我希望你一讀到標題中的「矢量」就會想到它。 –
最初沒有標題中的矢量。我通過編輯添加了它。原來的問題在語法上很糟糕。 – sawa
...和[Vector](http://ruby-doc.org/stdlib-2.2.0/libdoc/matrix/rdoc/Vector.html)。 –
什麼是't','m'和'v'?你期望的結果是什麼?你的示例代碼實際上並不修改數組,它會返回一個新的數組。 – Stefan
在'(m/v + 2)/ p1'中,你正在用數組劃分某些東西。嗯。 –
@CarySwoveland:不,我的意思是劃分數組內每個值的值。作爲乘法... – markzzz