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  }