9 people like it.

Slicing for Math.Net vectors and matrices

This snippet adds the 'GetSlice' operation to Math.Net vector and matrix types. This makes it possible to get sub-vectors and sub-matrices using the convenient syntax (For vectors 'vect.[start .. end]` or 'vect.[start ..]' and for matrices 'mat.[r1 .. r2, c1 .. c2]' and similar).

Vector and matrix extensions

 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
// Open Math.NET namespaces (you need MathNet.Numerics package)
open MathNet.Numerics
open MathNet.Numerics.FSharp
open MathNet.Numerics.LinearAlgebra.Double

// Define type extension for the generic vector type 
// (Here we need to repeat all constraints, so it is a bit ugly)
type MathNet.Numerics.LinearAlgebra.Generic.
    Vector<'T when 'T : struct and 'T : (new : unit -> 'T) 
               and 'T :> System.IEquatable<'T> and 'T :> System.IFormattable 
               and 'T :> System.ValueType> with
  /// Implements slicing of vector - both arguments are option types
  member x.GetSlice(start, finish) = 
    let start = defaultArg start 0
    let finish = defaultArg finish (x.Count - 1)
    x.SubVector(start, finish - start + 1)

// Define type extension for the generic matrix type
type MathNet.Numerics.LinearAlgebra.Generic.
    Matrix<'T when 'T : struct and 'T : (new : unit -> 'T) 
               and 'T :> System.IEquatable<'T> and 'T :> System.IFormattable 
               and 'T :> System.ValueType> with
  // Implement slicing for matrices (using rows & columns)
  member x.GetSlice(rstart, rfinish, cstart, cfinish) = 
    let cstart = defaultArg cstart 0
    let rstart = defaultArg rstart 0
    let cfinish = defaultArg cfinish (x.ColumnCount - 1)
    let rfinish = defaultArg rfinish (x.RowCount - 1)
    x.SubMatrix(rstart, rfinish - rstart + 1, cstart, cfinish - cstart + 1)

Examples of slicing

 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
// Get some slices from a vector
let v = vector [ 1.0; 2.0; 3.0 ]
v.[0 .. 1] // elements [1.0; 2.0]
v.[1 ..]   // elements [2.0; 3.0]
v.[.. 1]   // elements [1.0; 2.0]

// Example: Get some slices from a matrix
let m = matrix [ [ 1.0; 2.0; 3.0 ]
                 [ 4.0; 5.0; 6.0 ] ]

m.[0 .. 1, 0 .. 1] // get first square 2x2
m.[0 .. 1, 2 ..]   // get the last column
m.[1 .., 0 .. 2]   // get the last row
namespace MathNet
namespace MathNet.Numerics
namespace Microsoft.FSharp
namespace MathNet.Numerics.LinearAlgebra
namespace MathNet.Numerics.LinearAlgebra.Double
type Vector =
  inherit Vector<float>
  member AbsoluteMaximum : unit -> float
  member AbsoluteMaximumIndex : unit -> int
  member AbsoluteMinimum : unit -> float
  member AbsoluteMinimumIndex : unit -> int
  member CoerceZero : threshold:float -> unit
  member InfinityNorm : unit -> float
  member L1Norm : unit -> float
  member L2Norm : unit -> float
  member MaximumIndex : unit -> int
  member MinimumIndex : unit -> int
  ...

Full name: MathNet.Numerics.LinearAlgebra.Double.Vector
type unit = Unit

Full name: Microsoft.FSharp.Core.unit
namespace System
type IEquatable<'T> =
  member Equals : other:'T -> bool

Full name: System.IEquatable<_>
type IFormattable =
  member ToString : format:string * formatProvider:IFormatProvider -> string

Full name: System.IFormattable
type ValueType =
  member Equals : obj:obj -> bool
  member GetHashCode : unit -> int
  member ToString : unit -> string

Full name: System.ValueType
val defaultArg : arg:'T option -> defaultValue:'T -> 'T

Full name: Microsoft.FSharp.Core.Operators.defaultArg
type Matrix =
  inherit Matrix<float>
  member Cholesky : unit -> Cholesky<float>
  member CoerceZero : threshold:float -> unit
  member ColumnAbsoluteSums : unit -> Vector<float>
  member ColumnNorms : norm:float -> Vector<float>
  member ColumnSums : unit -> Vector<float>
  member ConjugateTranspose : unit -> Matrix<float>
  member Evd : ?symmetricity:Symmetricity -> Evd<float>
  member FrobeniusNorm : unit -> float
  member GramSchmidt : unit -> GramSchmidt<float>
  member InfinityNorm : unit -> float
  ...

Full name: MathNet.Numerics.LinearAlgebra.Double.Matrix
val v : obj

Full name: Script.v
val m : obj

Full name: Script.m

More information

Link:http://fssnip.net/dQ
Posted:5 years ago
Author:Tomas Petricek
Tags: math , mathnet , vector , getslice , matrix