mirror of
https://github.com/gonum/gonum.git
synced 2025-10-19 13:35:51 +08:00

This avoids the confusion between Zero() and IsZero() which sounds like they should be related to one another but are not. This makes IsEmpty the counterpart to Reset. Add check for Zero in allMatrix Fixes #1083. Updates #1081.
261 lines
5.3 KiB
Go
261 lines
5.3 KiB
Go
// 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 is empty (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("c = %v", fc)
|
|
|
|
// Output:
|
|
//
|
|
// 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("a = %v", fa)
|
|
|
|
// Output:
|
|
//
|
|
// 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("a = %v", fa)
|
|
|
|
// Output:
|
|
//
|
|
// 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("a = %v", fa)
|
|
|
|
// Output:
|
|
//
|
|
// 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("ia = %.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("r = %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("x = %v", fx)
|
|
|
|
// Output:
|
|
//
|
|
// ia = ⎡0.25 -0⎤
|
|
// ⎣ 0 0.25⎦
|
|
//
|
|
// r = ⎡1 0⎤
|
|
// ⎣0 1⎦
|
|
//
|
|
// x = ⎡0.5 0⎤
|
|
// ⎣ 0 0.5⎦
|
|
}
|
|
|
|
func ExampleDense_Mul() {
|
|
// Initialize two matrices, a and b.
|
|
a := mat.NewDense(2, 2, []float64{
|
|
4, 0,
|
|
0, 4,
|
|
})
|
|
b := mat.NewDense(2, 3, []float64{
|
|
4, 0, 0,
|
|
0, 0, 4,
|
|
})
|
|
|
|
// Take the matrix product of a and b and place the result in c.
|
|
var c mat.Dense
|
|
c.Mul(a, b)
|
|
|
|
// Print the result using the formatter.
|
|
fc := mat.Formatted(&c, mat.Prefix(" "), mat.Squeeze())
|
|
fmt.Printf("c = %v", fc)
|
|
|
|
// Output:
|
|
//
|
|
// c = ⎡16 0 0⎤
|
|
// ⎣ 0 0 16⎦
|
|
}
|
|
|
|
func ExampleDense_Exp() {
|
|
// Initialize a matrix a with some data.
|
|
a := mat.NewDense(2, 2, []float64{
|
|
1, 0,
|
|
0, 1,
|
|
})
|
|
|
|
// Take the exponential of the matrix and place the result in m.
|
|
var m mat.Dense
|
|
m.Exp(a)
|
|
|
|
// Print the result using the formatter.
|
|
fm := mat.Formatted(&m, mat.Prefix(" "), mat.Squeeze())
|
|
fmt.Printf("m = %4.2f", fm)
|
|
|
|
// Output:
|
|
//
|
|
// m = ⎡2.72 0.00⎤
|
|
// ⎣0.00 2.72⎦
|
|
}
|
|
|
|
func ExampleDense_Pow() {
|
|
// Initialize a matrix with some data.
|
|
a := mat.NewDense(2, 2, []float64{
|
|
4, 4,
|
|
4, 4,
|
|
})
|
|
|
|
// Take the second power of matrix a and place the result in m.
|
|
var m mat.Dense
|
|
m.Pow(a, 2)
|
|
|
|
// Print the result using the formatter.
|
|
fm := mat.Formatted(&m, mat.Prefix(" "), mat.Squeeze())
|
|
fmt.Printf("m = %v\n\n", fm)
|
|
|
|
// Take the zeroth power of matrix a and place the result in n.
|
|
// We expect an identity matrix of the same size as matrix a.
|
|
var n mat.Dense
|
|
n.Pow(a, 0)
|
|
|
|
// Print the result using the formatter.
|
|
fn := mat.Formatted(&n, mat.Prefix(" "), mat.Squeeze())
|
|
fmt.Printf("n = %v", fn)
|
|
|
|
// Output:
|
|
//
|
|
// m = ⎡32 32⎤
|
|
// ⎣32 32⎦
|
|
//
|
|
// n = ⎡1 0⎤
|
|
// ⎣0 1⎦
|
|
}
|
|
|
|
func ExampleDense_Scale() {
|
|
// Initialize a matrix with some data.
|
|
a := mat.NewDense(2, 2, []float64{
|
|
4, 4,
|
|
4, 4,
|
|
})
|
|
|
|
// Scale the matrix by a factor of 0.25 and place the result in m.
|
|
var m mat.Dense
|
|
m.Scale(0.25, a)
|
|
|
|
// Print the result using the formatter.
|
|
fm := mat.Formatted(&m, mat.Prefix(" "), mat.Squeeze())
|
|
fmt.Printf("m = %4.3f", fm)
|
|
|
|
// Output:
|
|
//
|
|
// m = ⎡1.000 1.000⎤
|
|
// ⎣1.000 1.000⎦
|
|
}
|