在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中的數字序號決定的。