github.com/wzzhu/tensor@v0.9.24/example_dense_linalg_test.go (about) 1 package tensor 2 3 import ( 4 "fmt" 5 ) 6 7 func ExampleDense_MatMul() { 8 handleErr := func(err error) { 9 if err != nil { 10 panic(err) 11 } 12 } 13 14 T0 := New(WithShape(10, 15), WithBacking(Range(Float64, 0, 150))) 15 T1 := New(WithShape(15, 10), WithBacking(Range(Float64, 150, 0))) 16 T2, err := MatMul(T0, T1) 17 handleErr(err) 18 19 fmt.Printf("T2:\n%v", T2) 20 21 // Output: 22 // T2: 23 // ⎡ 5600 5495 5390 5285 ... 4970 4865 4760 4655⎤ 24 // ⎢ 23600 23270 22940 22610 ... 21620 21290 20960 20630⎥ 25 // ⎢ 41600 41045 40490 39935 ... 38270 37715 37160 36605⎥ 26 // ⎢ 59600 58820 58040 57260 ... 54920 54140 53360 52580⎥ 27 // . 28 // . 29 // . 30 // ⎢113600 112145 110690 109235 ... 104870 103415 101960 100505⎥ 31 // ⎢131600 129920 128240 126560 ... 121520 119840 118160 116480⎥ 32 // ⎢149600 147695 145790 143885 ... 138170 136265 134360 132455⎥ 33 // ⎣167600 165470 163340 161210 ... 154820 152690 150560 148430⎦ 34 35 } 36 37 func ExampleDense_MatVecMul() { 38 handleErr := func(err error) { 39 if err != nil { 40 panic(err) 41 } 42 } 43 44 T0 := New(WithShape(2, 3), WithBacking(Range(Float64, 1, 7))) 45 T1 := New(WithShape(3), WithBacking(Range(Float64, 0, 3))) 46 T2, err := T0.MatVecMul(T1) 47 handleErr(err) 48 49 fmt.Printf("T2:\n%v\n", T2) 50 51 // Output: 52 // T2: 53 // [ 8 17] 54 } 55 56 func ExampleDense_MatVecMul_rowMajorSliced() { 57 // ASPIRATIONAL TODO: IncX and incY of differering values 58 59 handleErr := func(err error) { 60 if err != nil { 61 panic(err) 62 } 63 } 64 65 T0 := New(WithShape(10, 12), WithBacking(Range(Float64, 1, 121))) 66 T1 := New(WithShape(3, 3), WithBacking(Range(Float64, 1, 10))) 67 T2, err := T0.Slice(makeRS(1, 3), makeRS(3, 6)) 68 handleErr(err) 69 T3, err := T1.Slice(nil, makeRS(1, 2)) 70 handleErr(err) 71 72 // here the + formatting option is used because you should know that after this particular slice, the result will be a vector 73 fmt.Printf("T2:\n%+v", T2) 74 fmt.Printf("T3:\n%+v\n", T3) 75 76 // here we print the underlying slice of T3 just to show that it's actually a much larger slice 77 fmt.Printf("Underlying Slice: %v\n", T3.Data()) 78 79 T4, err := T2.(*Dense).MatVecMul(T3) 80 handleErr(err) 81 82 fmt.Printf("T4:\n%v\n", T4) 83 84 // Outputz: 85 // T2: 86 // Matrix (2, 3) [10 1] 87 // ⎡14 15 16⎤ 88 // ⎣24 25 26⎦ 89 // T3: 90 // Vector (3) [3] 91 // [2 5 8] 92 // Underlying Slice: [2 3 4 5 6 7 8] 93 // T4: 94 // [261 441] 95 96 } 97 98 func ExampleDense_MatMul_sliced() { 99 //ASPIRATIONAL TODO: incX and incY of different sizes 100 handleErr := func(err error) { 101 if err != nil { 102 panic(err) 103 } 104 } 105 106 T0 := New(WithShape(10, 15), WithBacking(Range(Float64, 0, 150))) 107 T1 := New(WithShape(15, 10), WithBacking(Range(Float64, 150, 0))) 108 T2, err := MatMul(T0, T1) 109 handleErr(err) 110 111 fmt.Printf("T2:\n%v", T2) 112 113 // Slice T0 to only take a (2, 3) on the upper quadrant 114 // T3 := T0[0:3, 0:2] 115 T3, err := T0.Slice(makeRS(0, 3), makeRS(0, 2)) 116 handleErr(err) 117 fmt.Printf("T3:\n%v", T3) 118 119 T4, err := T1.Slice(makeRS(13, 15), makeRS(8, 10)) 120 handleErr(err) 121 fmt.Printf("T4:\n%v", T4) 122 123 T5, err := T3.(*Dense).MatMul(T4) 124 handleErr(err) 125 fmt.Printf("T3xT4:\n%v", T5) 126 127 // Outputz: 128 // T2: 129 // ⎡ 5600 5495 5390 5285 ... 4970 4865 4760 4655⎤ 130 // ⎢ 23600 23270 22940 22610 ... 21620 21290 20960 20630⎥ 131 // ⎢ 41600 41045 40490 39935 ... 38270 37715 37160 36605⎥ 132 // ⎢ 59600 58820 58040 57260 ... 54920 54140 53360 52580⎥ 133 // . 134 // . 135 // . 136 // ⎢113600 112145 110690 109235 ... 104870 103415 101960 100505⎥ 137 // ⎢131600 129920 128240 126560 ... 121520 119840 118160 116480⎥ 138 // ⎢149600 147695 145790 143885 ... 138170 136265 134360 132455⎥ 139 // ⎣167600 165470 163340 161210 ... 154820 152690 150560 148430⎦ 140 // T3: 141 // ⎡ 0 1⎤ 142 // ⎢15 16⎥ 143 // ⎣30 31⎦ 144 // T4: 145 // ⎡12 11⎤ 146 // ⎣ 2 1⎦ 147 // T3xT4: 148 // ⎡ 2 1⎤ 149 // ⎢212 181⎥ 150 // ⎣422 361⎦ 151 }