Go語言 隨機曏量與曏量運算
隨機U(0,1)均勻分佈數組
func uniforms(dim int) []float64 { var vector []float64 for i := 0; i < dim; i { vector = append(vector, rand.Float64()) } returnvector }
隨機整數數組
func randInt(dim, n int) []int { var vector []int for i := 0; i < dim; i { vector = append(vector, rand.Intn(n)) } returnvector }
實例:
func printSliseInt(array []int) { for i := 0; i < len(array); i { fmt.Print(array[i], "") } fmt.Println() } func main() { var arr0 = uniforms(6) var arr1 = randInt(8, 2) var arr2 = randInt(8, 10) var arr3 = randInt(8, 2) var arr4 = randInt(8, 2) var arr5 = randInt(8, 2) printSlise(arr0) printSliseInt(arr1) printSliseInt(arr2) printSliseInt(arr3) printSliseInt(arr4) printSliseInt(arr5) fmt.Println("---end---") }
結果如下:
結果:
0.6046602879796196 0.9405090880450124 0.6645600532184904 0.4377141871869802 0.4246374970712657 0.6868230728671094
1 0 0 0 0 1 0 1
8 4 1 5 7 6 5 6
0 0 1 1 1 0 0 1
1 0 1 1 1 0 1 1
1 0 1 0 0 1 1 1
---end---
需要注意的是,無論重複運行多少次,結果都一模一樣,因爲隨機種子恒定,但是多次調用是不一樣的,因此大可放心地在算法中用,雖然多次運行結果複現,但是多次疊代中不複現。
根據這個操作,創建很常用的zeros和ones就輕而易擧了
func zeros(dim int) []float64 { var vector []float64 for i := 0; i < dim; i { vector = append(vector, float64(0)) } return vector } func ones(dim int) []float64 { var vector []float64 for i := 0; i < dim; i { vector = append(vector, float64(1)) } return vector } func main() { printSlise(zeros(5)) printSlise(ones(6)) fmt.Println("---end---") }
結果:
0 0 0 0 0
1 1 1 1 1 1
---end---
曏量的運算有常數和曏量逐元素相加減乘,曏量和曏量逐元素相加減乘,曏量和曏量內積
常數和曏量運算:
func scalaAdd(v []float64, a float64) []float64 { var res []float64 var n int =len(v) for i := 0; i < n; i { res = append(res, a v[i]) } return res } func scalaSubtract(v []float64, a float64) []float64 { var res []float64 var n int =len(v) for i := 0; i < n; i { res = append(res, v[i]-a) } return res } func scalaMulti(v []float64, a float64) []float64 { var res []float64 var n int =len(v) for i := 0; i < n; i { res = append(res, a*v[i]) } return res } func main() { var arr = []float64{4, 5, 7, 8, 2, 1} var arr1 = scalaAdd(arr, 10) arr2 := scalaSubtract(arr, 2) arr3 := scalaMulti(arr, 10) printSlise(arr) printSlise(arr1) printSlise(arr2) printSlise(arr3) fmt.Println("---end---") }
結果如下:
4 5 7 8 2 1
14 15 17 18 12 11
2 3 5 6 0 -1
40 50 70 80 20 10
曏量和曏量逐元素運算:
func add(v1 []float64, v2 []float64) []float64 { var res []float64 var n int =len(v2) for i := 0; i < n; i { res = append(res, v1[i] v2[i]) } return res } func subtract(v1 []float64, v2 []float64) []float64 { var res []float64 var n int =len(v2) for i := 0; i < n; i { res = append(res, v1[i]-v2[i]) } //fmt.Println(res) return res } func multiply(v1 []float64, v2 []float64) []float64 { var res []float64 var n int =len(v2) for i := 0; i < n; i { res = append(res, v1[i]*v2[i]) } return res } func main() { var arr0 = []float64{4, 5, 7, 8, 2, 1} var arr1 = scalaAdd(arr0, 10) var arr2 = add(arr1, arr0) var arr3 = subtract(arr1, arr0) arr4 := multiply(arr1, arr0) printSlise(arr0) printSlise(arr1) fmt.Println() printSlise(arr2) printSlise(arr3) printSlise(arr4) fmt.Println("---end---") }
結果:
4 5 7 8 2 1
14 15 17 18 12 11
18 20 24 26 14 12
10 10 10 10 10 10
56 75 119 144 24 11
曏量內積:
func innerMulti(v1 []float64, v2 []float64) float64 { var res float64 var n int =len(v1) for i := 0; i < n; i { res = v1[i] * v2[i] } return res } func main() { var arr0 = []float64{1, 2, 3, 4, 5} var arr1 = scalaAdd(arr0, 0) var arr2 = innerMulti(arr0, arr1) fmt.Println(arr2) fmt.Println("---end---") }
結果:
55
0條評論