6.8 Generic Functions (.NET, C#, CSharp, VB, Visual Basic, F#)
NMath provides generic functions that apply a given function delegate to every element in a matrix, or to every column in a matrix.
Applying Elementwise Functions
NMath provides convenience methods for applying unary and binary functions to elements of a matrix. Each of these methods takes a function delegate. The Apply() method returns a new matrix whose contents are the result of applying the given function to each element of the matrix. The Transform() method modifies a matrix object by applying the given function to each of its elements. For example, assuming MyFunc is a function that takes a double and returns a double:
Code Example – C# matrix
var A = new DoubleMatrix( 5, 5, 0, Math.Pi/4 );
var MyFuncDelegate = new Func<double, double>( MyFunc );
DoubleMatrix B = A.Apply( MyFuncDelegate );
Code Example – VB matrix
Dim A As New DoubleMatrix(5, 5, 0.0, Math.PI / 4.0)
Dim MyFuncDelegate As New Func(Of Double, Double)(MyFunc)
Dim B As DoubleMatrix = A.Apply(MyFuncDelegate)
NMath provides the ApplyColumns() method on the matrix classes for applying a vector function to columns of a matrix. This function takes a function delegate that accepts a vector and returns a single value.
For instance, assuming MyFunc takes a FloatVector and returns a float:
Code Example – C# matrix
var A = new FloatMatrix( 5, 5, 0, Math.Pi/4 );
var MyFuncDelegate = new Func<FloatVector, float>( MyFunc );
FloatVector v = A.ApplyColumns( MyFuncDelegate );
Code Example – VB matrix
Dim A As New FloatMatrix(5, 5, 0.0F, Math.PI / 4.0F)
Dim MyFuncDelegate As New Func(Of FloatVector, Single)(MyFunc)
Dim V As FloatVector = A.ApplyColumns(MyFuncDelegate)
To apply a function to the rows of matrix, just Transpose() the matrix first. Transpose() simply swaps the number of rows and the number of columns, as well as the row strides and column strides. No data is copied, so it's a relatively cheap operation. For instance:
Code Example – C# matrix
FloatVector v = A.Transpose().ApplyColumns( MyFuncDelegate );
A.Transpose(); // return A to original view
Code Example – VB matrix
Dim V As FloatVector = A.Transpose().ApplyColumns(MyFuncDelegate)
A.Transpose() ' return A to original view