From fa851461dde10e7f062ec1c98264bc50fdcdf428 Mon Sep 17 00:00:00 2001 From: Jeremy Atkinson Date: Tue, 24 Oct 2017 08:22:15 -0700 Subject: [PATCH] mat: added a few godoc examples for Dense methods (#263) * added a few godoc examples for Dense methods --- AUTHORS | 1 + CONTRIBUTORS | 1 + mat/dense_example_test.go | 130 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 mat/dense_example_test.go diff --git a/AUTHORS b/AUTHORS index 8185cba9..190a0e2d 100644 --- a/AUTHORS +++ b/AUTHORS @@ -30,6 +30,7 @@ James Bell James Bowman Janne Snabb Jeff Juozapaitis +Jeremy Atkinson Jonathan J Lawlor Jonathan Schroeder Joseph Watson diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 228d266b..64b1315b 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -37,6 +37,7 @@ James Bell James Bowman Janne Snabb Jeff Juozapaitis +Jeremy Atkinson Jonathan J Lawlor Jonathan Schroeder Joseph Watson diff --git a/mat/dense_example_test.go b/mat/dense_example_test.go new file mode 100644 index 00000000..32b93fed --- /dev/null +++ b/mat/dense_example_test.go @@ -0,0 +1,130 @@ +// Copyright ©2017 The gonum Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package mat_test + +import ( + "fmt" + + "gonum.org/v1/gonum/mat" +) + +func ExampleDense_Add() { + // Initialize two matrices, a and b. + a := mat.NewDense(2, 2, []float64{1, 0, 1, 0}) + b := mat.NewDense(2, 2, []float64{0, 1, 0, 1}) + + // Add a and b, placing the result into c. + // ...Notice that the size is automatically adjusted when the receiver has zero size. + var c mat.Dense + c.Add(a, b) + + // Print the result using the formatter. + fc := mat.Formatted(&c, mat.Prefix(" "), mat.Squeeze()) + fmt.Printf("Result:\nc = %v\n\n", fc) + // Output: + // Result: + // c = ⎡1 1⎤ + // ⎣1 1⎦ + // +} + +func ExampleDense_Sub() { + // Initialize two matrices, a and b. + a := mat.NewDense(2, 2, []float64{1, 1, 1, 1}) + b := mat.NewDense(2, 2, []float64{1, 0, 0, 1}) + + // Subtract b from a, placing the result into a. + a.Sub(a, b) + + // Print the result using the formatter. + fa := mat.Formatted(a, mat.Prefix(" "), mat.Squeeze()) + fmt.Printf("Result:\na = %v\n\n", fa) + // Output: + // Result: + // a = ⎡0 1⎤ + // ⎣1 0⎦ + // +} + +func ExampleDense_MulElem() { + // Initialize two matrices, a and b. + a := mat.NewDense(2, 2, []float64{1, 2, 3, 4}) + b := mat.NewDense(2, 2, []float64{1, 2, 3, 4}) + + // Multiply the elements of a and b, placing the result into a. + a.MulElem(a, b) + + // Print the result using the formatter. + fa := mat.Formatted(a, mat.Prefix(" "), mat.Squeeze()) + fmt.Printf("Result:\na = %v\n\n", fa) + // Output: + // Result: + // a = ⎡1 4⎤ + // ⎣9 16⎦ + // +} + +func ExampleDense_DivElem() { + // Initialize two matrices, a and b. + a := mat.NewDense(2, 2, []float64{5, 10, 15, 20}) + b := mat.NewDense(2, 2, []float64{5, 5, 5, 5}) + + // Divide the elements of a by b, placing the result into a. + a.DivElem(a, b) + + // Print the result using the formatter. + fa := mat.Formatted(a, mat.Prefix(" "), mat.Squeeze()) + fmt.Printf("Result:\na = %v\n\n", fa) + // Output: + // Result: + // a = ⎡1 2⎤ + // ⎣3 4⎦ + // +} + +func ExampleDense_Inverse() { + // Initialize two matrices, a and ia. + a := mat.NewDense(2, 2, []float64{4, 0, 0, 4}) + var ia mat.Dense + + // Take the inverse of a and place the result in ia. + ia.Inverse(a) + + // Print the result using the formatter. + fa := mat.Formatted(&ia, mat.Prefix(" "), mat.Squeeze()) + fmt.Printf("Result:\nia = %.2g\n\n", fa) + + // Confirm that A * A^-1 = I + var r mat.Dense + r.Mul(a, &ia) + fr := mat.Formatted(&r, mat.Prefix(" "), mat.Squeeze()) + fmt.Printf("Result:\nr = %v\n\n", fr) + + // The Inverse operation, however, is numerically unstable, and should typically be avoided. + // For example, a common need is to find x = A^-1 * b. In this case, the SolveVec method of VecDense + // (if b is a Vector) or Solve method of Dense (if b is a matrix) should used instead of computing + // the Inverse of A. + b := mat.NewDense(2, 2, []float64{2, 0, 0, 2}) + var x mat.Dense + x.Solve(a, b) + + // Print the result using the formatter. + fx := mat.Formatted(&x, mat.Prefix(" "), mat.Squeeze()) + fmt.Printf("Result:\nx = %v\n\n", fx) + + // Output: + // Result: + // ia = ⎡0.25 -0⎤ + // ⎣ 0 0.25⎦ + // + // Result: + // r = ⎡1 0⎤ + // ⎣0 1⎦ + // + // Result: + // x = ⎡0.5 0⎤ + // ⎣ 0 0.5⎦ + // +}