在C#中使用mathnet,须要利用using引入相关类数组
矩阵运算的相关类:函数
using MathNet.Numerics.LinearAlgebra.Double;测试
using MathNet.Numerics.LinearAlgebra.Generic;spa
经常使用矩阵初始化函数:调试
var matrix2 = new DenseMatrix(3); //3维方阵开发
var matrix3 = new DenseMatrix(2, 3); //2×3矩阵it
var matrix4 = new DenseMatrix(2, 3, 3.0); //2×3矩阵,全部值为3.0io
var matrixI = DenseMatrix.Identity(5); //5维单位矩阵for循环
矩阵操做和C#中的数组操做一致,matrix2[m,n]取其m行n列上的值或对其赋值效率
MathNet中重载了.ToString()函数,能够直接用matrix.ToString()输出整个数组,大大方便了调试和保存数据。
也能够利用C#中的double[,]直接建立
double[,] d_matrix = new double[2,3];
var matrix2 = new DenseMatrix(d_matrix); //2×3矩阵
小记:我曾作过测试,将double[,]先转成Math矩阵,而后进行矩阵运算,再利用matrix2.ToArray()将Math矩阵转换成double[,],其运算时间和直接利用C#编写的矩阵运算相差很小。
但若是是利用for循环将double数组的数值赋值给Math矩阵进行矩阵运算,而后再利用for循环将Math矩阵赋值给某个double[,]数组,其运算时间能够减小1/3。在开发效率和运算效率上,使用的时候能够根据须要进行取舍。
2.矩阵操做
矩阵操做最经常使用的莫过于从一个矩阵中取值
var submatrix = matrix.SubMatrix(2, 2, 3, 3); //取从第二行开始的2行,第三列开始的三列 子矩阵
var row = matrix.Row(5, 3, 4); //取从第5行第3列开始的4个行元素
var column = matrix.Column(2, 6, 3); //取从第2列第6行开始的3个列元素
matrix.ColumnEnumerator(2, 4) //取从第2列开始的4列
matrix.RowEnumerator(4, 3)//取从第4行开始的3行
matrix.ToRowWiseArray()/matrix.ToColumnWiseArray() //矩阵变为行向量或者列向量
matrix.Diagonal()//取矩阵的对角线元素向量
向矩阵中插值
var result = matrix.InsertColumn(3, vector)/matrix.InsertRow(3, vector);//将向量vector插入到指定的行/列,原有的行列顺延
matrix.SetColumn(2, (Vector)vector);/matrix.SetRow(3, (double[])vector); //用vector替换指定的行/列
matrix.SetSubMatrix(1, 3, 1, 3, DenseMatrix.Identity(3)); //用矩阵替换指定位置的块矩阵
matrix.SetDiagonal(new[] { 5.0, 4.0, 3.0, 2.0, 1.0 }); //替换矩阵的对角线元素
matrixA.Append(matrixB,result)/matrixA.Stack(matrixB,result) //将matrixB扩展到matrixA的右方/上方,将结果保存在result中
矩阵转换:
var permutations = new Permutation(new[] { 0, 1, 3, 2, 4 });
matrix.PermuteRows(permutations); //互换矩阵的3,4行
permutations = new Permutation(new[] { 1, 0, 4, 3, 2 });
matrix.PermuteColumns(permutations); //互换矩阵的1,2列,3,5列。
能够看出,互换是由Permutation中的数字序号决定的。