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

留言

熱門文章