mirror of
https://github.com/gonum/gonum.git
synced 2025-10-05 23:26:52 +08:00
270 lines
5.5 KiB
Go
270 lines
5.5 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"
|
|
"log"
|
|
|
|
"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 a matrix A.
|
|
a := mat.NewDense(2, 2, []float64{
|
|
2, 1,
|
|
6, 4,
|
|
})
|
|
|
|
// Compute the inverse of A.
|
|
var aInv mat.Dense
|
|
err := aInv.Inverse(a)
|
|
if err != nil {
|
|
log.Fatalf("A is not invertible: %v", err)
|
|
}
|
|
|
|
// Print the result using the formatter.
|
|
fa := mat.Formatted(&aInv, mat.Prefix(" "), mat.Squeeze())
|
|
fmt.Printf("aInv = %.2g\n\n", fa)
|
|
|
|
// Confirm that A * A^-1 = I.
|
|
var I mat.Dense
|
|
I.Mul(a, &aInv)
|
|
fi := mat.Formatted(&I, mat.Prefix(" "), mat.Squeeze())
|
|
fmt.Printf("I = %v\n\n", fi)
|
|
|
|
// The Inverse operation, however, should typically be avoided. If the
|
|
// goal is to solve a linear system
|
|
// A * X = B,
|
|
// then the inverse is not needed and computing the solution as
|
|
// X = A^{-1} * B is slower and has worse stability properties than
|
|
// solving the original problem. In this case, the SolveVec method of
|
|
// VecDense (if B is a vector) or Solve method of Dense (if B is a
|
|
// matrix) should be used instead of computing the Inverse of A.
|
|
b := mat.NewDense(2, 2, []float64{
|
|
2, 3,
|
|
1, 2,
|
|
})
|
|
var x mat.Dense
|
|
err = x.Solve(a, b)
|
|
if err != nil {
|
|
log.Fatalf("no solution: %v", err)
|
|
}
|
|
|
|
// Print the result using the formatter.
|
|
fx := mat.Formatted(&x, mat.Prefix(" "), mat.Squeeze())
|
|
fmt.Printf("x = %.1f", fx)
|
|
|
|
// Output:
|
|
//
|
|
// aInv = ⎡ 2 -0.5⎤
|
|
// ⎣-3 1⎦
|
|
//
|
|
// I = ⎡1 0⎤
|
|
// ⎣0 1⎦
|
|
//
|
|
// x = ⎡ 3.5 5.0⎤
|
|
// ⎣-5.0 -7.0⎦
|
|
}
|
|
|
|
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⎦
|
|
}
|