国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

【原創】開源Math.NET基礎數學類庫使用(02)矩陣向量計算

2019-11-17 02:33:54
字體:
來源:轉載
供稿:網友

【原創】開源Math.NET基礎數學類庫使用(02)矩陣向量計算

本博客所有文章分類的總目錄:【總目錄】本博客博文總目錄-實時更新

開源Math.NET基礎數學類庫使用總目錄:【目錄】開源Math.NET基礎數學類庫使用總目錄

前言

  本文開始一一介紹Math.NET的幾個主要子項目的相關功能的使用。今天先要介紹的是最基本Math.NET Numerics的最基本矩陣與向量計算。

  如果本文章資源下載不了,或者文章顯示有問題,請參考本文原文地址:http://m.survivalescaperooms.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>, IFormattable3 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-Double11 0.55  0.5512 0.55  0.5513 14 matrix2: DenseMatrix 2x3-Double15 0  1  216 3  4  517 18 diagMaxtrix: DenseMatrix 3x3-Double19 5  0  020 0  5  021 0  0  522 23 fromArray: DenseMatrix 2x2-Double24 1  225 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 //矩陣與向量相乘 左乘 也可以使用LeftMultiply24 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-Double10 14.00     26.00    38.0011 32.00     62.00    92.0012 50.00     98.00   146.00

4.資源

  資源大家可以去本系列文章的首頁進行下載:

  如果本文章資源或者顯示有問題,請參考本文原文地址:http://m.survivalescaperooms.com/asxinyu/p/4265406.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 台北市| 安化县| 绩溪县| 建湖县| 绥阳县| 乌兰县| 辽宁省| 嘉祥县| 抚远县| 扎鲁特旗| 日喀则市| 滁州市| 涞源县| 永州市| 米脂县| 嫩江县| 陕西省| 盱眙县| 赤水市| 怀远县| 留坝县| 沁源县| 前郭尔| 镇康县| 杭锦旗| 涞源县| 梁河县| 民县| 绥棱县| 忻城县| 西林县| 香格里拉县| 建昌县| 广州市| 上蔡县| 琼海市| 四川省| 油尖旺区| 许昌县| 昌黎县| 浠水县|