-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvec.go
96 lines (82 loc) · 1.64 KB
/
vec.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package linalg
import (
"math"
)
// Vector Type that supports basic arithmatic operations
type Vec struct {
Size int
Values []float64
}
// Methods
func (v Vec) Len() float64 {
result := 0.0
for _, val := range v.Values {
result += val * val
}
return math.Sqrt(result)
}
// Contructors
// Constructs A New Vector From Arguments
func NewVec(values ...float64) Vec {
return Vec{
Size: len(values),
Values: values,
}
}
// Constructs a New Vector with given size
func NewSizedVec(size int, value float64) Vec {
values := []float64{}
for i := 0; i < size; i++ {
values = append(values, value)
}
return Vec{
Values: values,
Size: size,
}
}
// Map iterates through a vector and applies a function to it
func Map(v Vec, f func(a float64, i int) float64) Vec {
values := []float64{}
for i, val := range v.Values {
values = append(values, f(val, i))
}
return Vec{
Values: values,
Size: v.Size,
}
}
// Construct A New Vector from Pair of vectors by applying the given argument `f` on each pair
func NewFromEachPair(v Vec, o Vec, f func(a, b float64) float64) Vec {
checkEqualSize(v, o)
return Map(v, func(a float64, i int) float64 {
return f(a, o.Values[i])
})
}
// Accessors Aliases
func (v Vec) X() float64 {
return v.Values[0]
}
func (v Vec) Y() float64 {
return v.Values[1]
}
func (v Vec) Z() float64 {
return v.Values[2]
}
func (v Vec) U() float64 {
return v.Values[0]
}
func (v Vec) V() float64 {
return v.Values[1]
}
func (v Vec) R() float64 {
return v.Values[0]
}
func (v Vec) G() float64 {
return v.Values[1]
}
func (v Vec) B() float64 {
return v.Values[2]
}
func (v Vec) A() float64 {
return v.Values[3]
}