github.com/jingcheng-WU/gonum@v0.9.1-0.20210323123734-f1a2a11a8f7b/mat/dense_example_test.go (about) 1 // Copyright ©2017 The Gonum Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package mat_test 6 7 import ( 8 "fmt" 9 "log" 10 11 "github.com/jingcheng-WU/gonum/mat" 12 ) 13 14 func ExampleDense_Add() { 15 // Initialize two matrices, a and b. 16 a := mat.NewDense(2, 2, []float64{ 17 1, 0, 18 1, 0, 19 }) 20 b := mat.NewDense(2, 2, []float64{ 21 0, 1, 22 0, 1, 23 }) 24 25 // Add a and b, placing the result into c. 26 // Notice that the size is automatically adjusted 27 // when the receiver is empty (has zero size). 28 var c mat.Dense 29 c.Add(a, b) 30 31 // Print the result using the formatter. 32 fc := mat.Formatted(&c, mat.Prefix(" "), mat.Squeeze()) 33 fmt.Printf("c = %v", fc) 34 35 // Output: 36 // 37 // c = ⎡1 1⎤ 38 // ⎣1 1⎦ 39 } 40 41 func ExampleDense_Sub() { 42 // Initialize two matrices, a and b. 43 a := mat.NewDense(2, 2, []float64{ 44 1, 1, 45 1, 1, 46 }) 47 b := mat.NewDense(2, 2, []float64{ 48 1, 0, 49 0, 1, 50 }) 51 52 // Subtract b from a, placing the result into a. 53 a.Sub(a, b) 54 55 // Print the result using the formatter. 56 fa := mat.Formatted(a, mat.Prefix(" "), mat.Squeeze()) 57 fmt.Printf("a = %v", fa) 58 59 // Output: 60 // 61 // a = ⎡0 1⎤ 62 // ⎣1 0⎦ 63 } 64 65 func ExampleDense_MulElem() { 66 // Initialize two matrices, a and b. 67 a := mat.NewDense(2, 2, []float64{ 68 1, 2, 69 3, 4, 70 }) 71 b := mat.NewDense(2, 2, []float64{ 72 1, 2, 73 3, 4, 74 }) 75 76 // Multiply the elements of a and b, placing the result into a. 77 a.MulElem(a, b) 78 79 // Print the result using the formatter. 80 fa := mat.Formatted(a, mat.Prefix(" "), mat.Squeeze()) 81 fmt.Printf("a = %v", fa) 82 83 // Output: 84 // 85 // a = ⎡1 4⎤ 86 // ⎣9 16⎦ 87 } 88 89 func ExampleDense_DivElem() { 90 // Initialize two matrices, a and b. 91 a := mat.NewDense(2, 2, []float64{ 92 5, 10, 93 15, 20, 94 }) 95 b := mat.NewDense(2, 2, []float64{ 96 5, 5, 97 5, 5, 98 }) 99 100 // Divide the elements of a by b, placing the result into a. 101 a.DivElem(a, b) 102 103 // Print the result using the formatter. 104 fa := mat.Formatted(a, mat.Prefix(" "), mat.Squeeze()) 105 fmt.Printf("a = %v", fa) 106 107 // Output: 108 // 109 // a = ⎡1 2⎤ 110 // ⎣3 4⎦ 111 } 112 113 func ExampleDense_Inverse() { 114 // Initialize a matrix A. 115 a := mat.NewDense(2, 2, []float64{ 116 2, 1, 117 6, 4, 118 }) 119 120 // Compute the inverse of A. 121 var aInv mat.Dense 122 err := aInv.Inverse(a) 123 if err != nil { 124 log.Fatalf("A is not invertible: %v", err) 125 } 126 127 // Print the result using the formatter. 128 fa := mat.Formatted(&aInv, mat.Prefix(" "), mat.Squeeze()) 129 fmt.Printf("aInv = %.2g\n\n", fa) 130 131 // Confirm that A * A^-1 = I. 132 var I mat.Dense 133 I.Mul(a, &aInv) 134 fi := mat.Formatted(&I, mat.Prefix(" "), mat.Squeeze()) 135 fmt.Printf("I = %v\n\n", fi) 136 137 // The Inverse operation, however, should typically be avoided. If the 138 // goal is to solve a linear system 139 // A * X = B, 140 // then the inverse is not needed and computing the solution as 141 // X = A^{-1} * B is slower and has worse stability properties than 142 // solving the original problem. In this case, the SolveVec method of 143 // VecDense (if B is a vector) or Solve method of Dense (if B is a 144 // matrix) should be used instead of computing the Inverse of A. 145 b := mat.NewDense(2, 2, []float64{ 146 2, 3, 147 1, 2, 148 }) 149 var x mat.Dense 150 err = x.Solve(a, b) 151 if err != nil { 152 log.Fatalf("no solution: %v", err) 153 } 154 155 // Print the result using the formatter. 156 fx := mat.Formatted(&x, mat.Prefix(" "), mat.Squeeze()) 157 fmt.Printf("x = %.1f", fx) 158 159 // Output: 160 // 161 // aInv = ⎡ 2 -0.5⎤ 162 // ⎣-3 1⎦ 163 // 164 // I = ⎡1 0⎤ 165 // ⎣0 1⎦ 166 // 167 // x = ⎡ 3.5 5.0⎤ 168 // ⎣-5.0 -7.0⎦ 169 } 170 171 func ExampleDense_Mul() { 172 // Initialize two matrices, a and b. 173 a := mat.NewDense(2, 2, []float64{ 174 4, 0, 175 0, 4, 176 }) 177 b := mat.NewDense(2, 3, []float64{ 178 4, 0, 0, 179 0, 0, 4, 180 }) 181 182 // Take the matrix product of a and b and place the result in c. 183 var c mat.Dense 184 c.Mul(a, b) 185 186 // Print the result using the formatter. 187 fc := mat.Formatted(&c, mat.Prefix(" "), mat.Squeeze()) 188 fmt.Printf("c = %v", fc) 189 190 // Output: 191 // 192 // c = ⎡16 0 0⎤ 193 // ⎣ 0 0 16⎦ 194 } 195 196 func ExampleDense_Exp() { 197 // Initialize a matrix a with some data. 198 a := mat.NewDense(2, 2, []float64{ 199 1, 0, 200 0, 1, 201 }) 202 203 // Take the exponential of the matrix and place the result in m. 204 var m mat.Dense 205 m.Exp(a) 206 207 // Print the result using the formatter. 208 fm := mat.Formatted(&m, mat.Prefix(" "), mat.Squeeze()) 209 fmt.Printf("m = %4.2f", fm) 210 211 // Output: 212 // 213 // m = ⎡2.72 0.00⎤ 214 // ⎣0.00 2.72⎦ 215 } 216 217 func ExampleDense_Pow() { 218 // Initialize a matrix with some data. 219 a := mat.NewDense(2, 2, []float64{ 220 4, 4, 221 4, 4, 222 }) 223 224 // Take the second power of matrix a and place the result in m. 225 var m mat.Dense 226 m.Pow(a, 2) 227 228 // Print the result using the formatter. 229 fm := mat.Formatted(&m, mat.Prefix(" "), mat.Squeeze()) 230 fmt.Printf("m = %v\n\n", fm) 231 232 // Take the zeroth power of matrix a and place the result in n. 233 // We expect an identity matrix of the same size as matrix a. 234 var n mat.Dense 235 n.Pow(a, 0) 236 237 // Print the result using the formatter. 238 fn := mat.Formatted(&n, mat.Prefix(" "), mat.Squeeze()) 239 fmt.Printf("n = %v", fn) 240 241 // Output: 242 // 243 // m = ⎡32 32⎤ 244 // ⎣32 32⎦ 245 // 246 // n = ⎡1 0⎤ 247 // ⎣0 1⎦ 248 } 249 250 func ExampleDense_Scale() { 251 // Initialize a matrix with some data. 252 a := mat.NewDense(2, 2, []float64{ 253 4, 4, 254 4, 4, 255 }) 256 257 // Scale the matrix by a factor of 0.25 and place the result in m. 258 var m mat.Dense 259 m.Scale(0.25, a) 260 261 // Print the result using the formatter. 262 fm := mat.Formatted(&m, mat.Prefix(" "), mat.Squeeze()) 263 fmt.Printf("m = %4.3f", fm) 264 265 // Output: 266 // 267 // m = ⎡1.000 1.000⎤ 268 // ⎣1.000 1.000⎦ 269 }