golang - vector dot product
收錄在 Ameba 的一百篇
--
cos30 度是多少
我們可以參考這段程式 - github
有底下三種方式
1. math.Cos(math.Pi/6)
math.Pi 是 180 度, 所以 除以 6 為 30 度
2. 根號3 除以 2
math.Sqrt(3) / 2
今天介紹第三種, 用向量內積 (或稱作 點積 dot product)
3. 用向量計算,
u = (ux, uy) , v = (vx, vy)
向量內積 :
這怎麼得到呢? 可以參考這篇 - 向量內積
首先先定義向量內積為
三角形為:
假設 u = <a, b>, v = <c, d> , 我們從 餘弦定理 可以得知:
因此:
回頭看三角形,
向量 A 是底線 這根 (根號3, 0)
向量 C 是斜線 這根 (根號3, 1)
|C| 就是 norm-2 : 也就是向量的長度:
所以 cos30 可以用底下方式計算:
程式利用 gonum floats , 可以參考這篇 godoc
因為學習的關係, 搬了一些 code 到:
https://github.com/neojou/mygota/tree/master/gonum/floats
當執行 go get -u github.com/neojou/mygota/gonum/floats,
golang 就會把相關程式從網路上抓到 $GOROOT 或 $GOPATH 下的
src/github.com/neojou/mygota/gonum/floats
也因此, import 的時候加上
"github.com/neojou/mygota/gonum/floats"
就可以用 package floats
(1) vector 宣告
vectorA := []float64{sqrt3, 0}
vectorC := []float64{sqrt3, 1}
(2) vector dot product
dotProduct := floats.Dot(vectorA, vectorC)
程式:
https://github.com/neojou/mygota/blob/master/gonum/internal/asm/f64/dot.go
(3) vector normalization
normA := floats.Norm(vectorA, 2)
normC := floats.Norm(vectorC, 2)
這邊用到 math.Hypot()
Hypot -- sqrt(p*p + q*q)
( 總覺得這段似乎不是那麼有效率, 下回來量量效能... )
執行結果: go run myvector.go
vectorA=[1.7320508075688772 0]
vectorC=[1.7320508075688772 1]
A*C=2.9999999999999996
normC = 2.000000
cos30 = 0.866025
angle = 0.866025
sqrt3/2 = 0.866025
留言
張貼留言