
矩陣與向量計算是數學計算的核心,是以也是Math.NET Numerics的核心和基礎。Math.NET包括對向量(Vector)和矩陣(Matrix)的支援,類型也很多。其主要注意點有:索引是從0開始,不支援空的向量和矩陣,也就是說維數或者長度最少為1。它也支援稀疏矩陣和非稀疏矩陣的向量類型。其矩陣有3種類型:稀疏,非稀疏,對角。這2個類在MathNet.Numerics.LinearAlgebra命名空間。由于一些技術和表示的原因,每一種資料類型都有一個實作,例如MathNet.Numerics.LinearAlgebra.Double有一個DenseMatrix類型,Matrix 是抽象類型, 要通過其他方法去初始化。可以看看源碼中的定義:
本部落格所有文章分類的總目錄:【總目錄】本部落格博文總目錄-實時更新
開源Math.NET基礎數學類庫使用總目錄:【目錄】開源Math.NET基礎數學類庫使用總目錄
前言
本文開始一一介紹Math.NET的幾個主要子項目的相關功能的使用。今天先要介紹的是最基本Math.NET Numerics的最基本矩陣與向量計算。
如果本文章資源下載下傳不了,或者文章顯示有問題,請參考 本文原文位址:http://www.cnblogs.com/asxinyu/p/4265406.html
1.建立Numerics矩陣與向量
矩陣與向量計算是數學計算的核心,是以也是Math.NET Numerics的核心和基礎。
Math.NET包括對向量(Vector)和矩陣(Matrix)的支援,類型也很多。其主要注意點有:索引是從0開始,不支援空的向量和矩陣,也就是說維數或者長度最少為1。它也支援稀疏矩陣和非稀疏矩陣的向量類型。其矩陣有3種類型:稀疏,非稀疏,對角。這2個類在MathNet.Numerics.LinearAlgebra命名空間。由于一些技術和表示的原因,每一種資料類型都有一個實作,例如MathNet.Numerics.LinearAlgebra.Double有一個DenseMatrix類型,Matrix<T> 是抽象類型, 要通過其他方法去初始化。可以看看源碼中的定義:
1 public abstract partial class Vector<T> :IFormattable, IEquatable<Vector<T>>, IList, IList<T>
2 where T : struct, IEquatable<T>, IFormattable
3 public abstract partial class Matrix<T> :IFormattable, IEquatable<Matrix<T>>
4 where T : struct, IEquatable<T>, IFormattable
建立也很簡單,可以大概看看下面這段代碼,構造函數還有更多的用法,不一一示範,要自己研究下源代碼,記得要引用MathNet.Numerics.LinearAlgebra命名空間:
1 //初始化一個矩陣和向量的建構對象
2 var mb = Matrix<double>.Build;
3 var vb = Vector<double>.Build;
4
5 //擷取随機矩陣,也可以設定随機數所屬的分布
6 var randomMatrix = mb.Random(2,3);
7 //向量相當于是一個一維數組,隻有長度
8 var vector0 = vb.Random(3);//也可以選擇分布
9
10 //矩陣還可以這樣初始化
11 var matrix1 = mb.Dense(2,2,0.55);
12 //使用函數初始化
13 var matrix2 = mb.Dense(2,3,(i,j)=>3*i + j );
14
15 //對角矩陣
16 var diagMaxtrix = mb.DenseDiagonal(3,3,5);
17
18 Console.WriteLine("randomMatrix: "+randomMatrix.ToString());
19 Console.WriteLine("vector0: "+vector0.ToString());
20 Console.WriteLine("matrix1: "+matrix1.ToString());
21 Console.WriteLine("matrix2: "+matrix2.ToString());
22 Console.WriteLine("diagMaxtrix: "+diagMaxtrix.ToString());
23
24 //當然也可以直接從數組中建立
25 double[,] x = {{ 1.0, 2.0 },{ 3.0, 4.0 }};
26 var fromArray = mb.DenseOfArray(x);
27
28 Console.WriteLine("fromArray: "+fromArray.ToString());
結果如下,順便說一下,Matrix和Vector對象已經對ToString進行了重載,以比較标準化的格式化字元串輸出,很友善顯示和觀察:
1 randomMatrix: DenseMatrix 2x3-Double
2 0.785955 0.168426 -0.752291
3 0.878987 -0.220992 0.0911499
4
5 vector0: DenseVector 3-Double
6 -0.47651
7 -0.42378
8 -0.182919
9
10 matrix1: DenseMatrix 2x2-Double
11 0.55 0.55
12 0.55 0.55
13
14 matrix2: DenseMatrix 2x3-Double
15 0 1 2
16 3 4 5
17
18 diagMaxtrix: DenseMatrix 3x3-Double
19 5 0 0
20 0 5 0
21 0 0 5
22
23 fromArray: DenseMatrix 2x2-Double
24 1 2
25 3 4
2.矩陣與向量的算術運算
Matrix和Vector都支援常見的操作運算符号:+ ,- , * ,/ ,%等。我們可以從源碼中看到部分這樣的結構,限于篇幅,隻簡單列舉幾個重載操作符的方法,詳細的源碼在Matrix.Operators.cs檔案:
1 public static Matrix<T> operator +(Matrix<T> rightSide)
2 {
3 return rightSide.Clone();
4 }
5 public static Matrix<T> operator -(Matrix<T> rightSide)
6 {
7 return rightSide.Negate();
8 }
9 public static Matrix<T> operator *(Matrix<T> leftSide, T rightSide)
10 {
11 return leftSide.Multiply(rightSide);
12 }
13 public static Matrix<T> operator /(T dividend, Matrix<T> divisor)
14 {
15 return divisor.DivideByThis(dividend);
16 }
矩陣的相關操作是線性代數的核心和基礎,而Matrix的基礎功能也是非常強大的,我們看看Matrix的關于矩陣操作的相關代碼,不僅包括常見矩陣分解算法,如LU,QR,Cholesky等,而且還包括一些線性方程的求解,都是可以直接通過執行個體方法進行的,看看抽象類的方法原型,具體的代碼在Matrix.Solve.cs檔案中:
1 public abstract Cholesky<T> Cholesky();
2 public abstract LU<T> LU();
3 public abstract QR<T> QR(QRMethod method = QRMethod.Thin);
4 public abstract GramSchmidt<T> GramSchmidt();
5 public abstract Svd<T> Svd(bool computeVectors = true);
6 public abstract Evd<T> Evd(Symmetricity symmetricity = Symmetricity.Unknown);
7 public void Solve(Vector<T> input, Vector<T> result)
8 {
9 if (ColumnCount == RowCount)
10 {
11 LU().Solve(input, result);
12 return;
13 }
14 QR().Solve(input, result);
15 }
16 public void Solve(Matrix<T> input, Matrix<T> result)
17 {
18 if (ColumnCount == RowCount)
19 {
20 LU().Solve(input, result);
21 return;
22 }
23 QR().Solve(input, result);
24 }
25
26 public Matrix<T> Solve(Matrix<T> input)
27 {
28 var x = Build.SameAs(this, ColumnCount, input.ColumnCount);
29 Solve(input, x);
30 return x;
31 }
32 public Vector<T> Solve(Vector<T> input)
33 {
34 var x = Vector<T>.Build.SameAs(this, ColumnCount);
35 Solve(input, x);
36 return x;
37 }
3.矩陣計算綜合例子
上面的一些說明可以看到一些基本的方法情況,下面有一個實際的例子,說明基本的矩陣運算情況,當然更多進階的功能不能在一篇裡面一一講到,後續還會逐漸挖掘其他使用。上代碼:
1 // 格式
2 var formatProvider = (CultureInfo)CultureInfo.InvariantCulture.Clone();
3 formatProvider.TextInfo.ListSeparator = " ";
4
5 //建立A,B矩陣
6 var matrixA = DenseMatrix.OfArray(new[,] { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 }, { 7.0, 8.0, 9.0 } });
7 var matrixB = DenseMatrix.OfArray(new[,] { { 1.0, 3.0, 5.0 }, { 2.0, 4.0, 6.0 }, { 3.0, 5.0, 7.0 } });
8
9 //矩陣與标量相乘 ,使用運算符 *
10 var resultM = 3.0 * matrixA;
11 Console.WriteLine(@"Multiply matrix by scalar using operator *. (result = 3.0 * A)");
12 Console.WriteLine(resultM.ToString("#0.00\t", formatProvider));
13 Console.WriteLine();
14
15 //使用Multiply相乘,結果和上面一樣
16 resultM = (DenseMatrix)matrixA.Multiply(3.0);
17
18 //矩陣與向量相乘 右乘
19 var vector = new DenseVector(new[] { 1.0, 2.0, 3.0 });
20 var resultV = matrixA * vector;
21 22
23 //矩陣與向量相乘 左乘 也可以使用LeftMultiply
24 resultV = vector * matrixA;
25
26 //2個矩陣相乘,要注意矩陣乘法的維數要求
27 resultM = matrixA * matrixB;//也可以使用Multiply方法
28 Console.WriteLine(@"Multiply matrix by matrix using operator *. (result = A * B)");
29 Console.WriteLine(resultM.ToString("#0.00\t", formatProvider));
30 Console.WriteLine();
31
32 //矩陣加法 使用 + ,或者Add方法
33 resultM = matrixA + matrixB;
34 resultM = (DenseMatrix)matrixA.Add(matrixB);
35
36 //矩陣減法 使用 - ,或者Subtract方法
37 resultM = matrixA - matrixB;
38 resultM = (DenseMatrix)matrixA.Subtract(matrixB);
39
40 //矩陣除法,使用 Divide
41 resultM = (DenseMatrix)matrixA.Divide(3.0);
過程比較簡單,結果這裡隻列出部分:
1 Multiply matrix by scalar using operator *. (result = 3.0 * A)
2 DenseMatrix 3x3-Double
3 3.00 6.00 9.00
4 12.00 15.00 18.00
5 21.00 24.00 27.00
6
7
8 Multiply matrix by matrix using operator *. (result = A * B)
9 DenseMatrix 3x3-Double
10 14.00 26.00 38.00
11 32.00 62.00 92.00
12 50.00 98.00 146.00
4.資源
資源大家可以去本系列文章的首頁進行下載下傳:
如果本文章資源或者顯示有問題,請參考本文原文位址:http://www.cnblogs.com/asxinyu/p/4265406.html
.NET資料挖掘與機器學習,作者部落格:
http://www.cnblogs.com/asxinyu
E-mail:[email protected]