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