开源Math.NET基础数学类库使用(02)矩阵向量计算

简介: 原文:【原创】开源Math.NET基础数学类库使用(02)矩阵向量计算 开源Math.NET基础数学类库使用系列文章总目录:    1.开源.NET基础数学计算组件Math.NET(一)综合介绍     2.
原文: 【原创】开源Math.NET基础数学类库使用(02)矩阵向量计算

 开源Math.NET基础数学类库使用系列文章总目录: 

  1.开源.NET基础数学计算组件Math.NET(一)综合介绍  

  2.开源.NET基础数学计算组件Math.NET(二)矩阵向量计算 

  3.开源.NET基础数学计算组件Math.NET(三)C#解析Matlab的mat格式

  4.开源.NET基础数学类库使用Math.NET(四)C#解析Matrix Marke数据格式

  5.开源.NET基础数学类库使用Math.NET(五)C#解析Delimited Formats数据格式

  6.开源.NET基础数学类库使用Math.NET(六)数值分析之线性方程直接求解

  7.开源.NET基础数学类库使用Math.NET(七)常用的一些数学常数 

  8.开源.NET基础数学类库使用Math.NET(八)C#进行数值积分

  9.开源.NET基础数学类库使用Math.NET(九)相关数论函数使用

10.开源.NET基础数学类库使用Math.NET(十)C#进行数据统计

11.开源.NET基础数学类库使用Math.NET(十一)C#计算相关系数

12.开源.NET基础数学类库使用Math.NET(十二)随机数扩展方法

13.开源.NET基础数学类库使用Math.NET(十三)C#实现其他随机数生成器

14.开源.NET基础数学类库使用Math.NET(十四)安全的随机数生成器扩展

后续继续更新中。。如文章链接打开有误,请关注博客,因为文章正在编辑修改中,所有已经列出的目录都将在1个月之内发表。 

前言

  本文开始一一介绍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开源技术文章,您可能感兴趣: 

1.开源Math.NET基础数学类库使用系列文章链接

2.开源C#彩票数据资料库系列文章链接

3.开源的.NET平台ORM组件文章:链接

4.其他开源的.NET组件文章:链接

5..NET平台机器学习组件-Infer.NET系列文章:链接

6.Matlab混合编程文章:链接 

 
相关实践学习
使用CLup和iSCSI共享盘快速体验PolarDB for PostgtreSQL
在Clup云管控平台中快速体验创建与管理在iSCSI共享盘上的PolarDB for PostgtreSQL。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
|
11天前
|
C# Windows
.NET开源免费的Windows快速文件搜索和应用程序启动器
今天大姚给大家分享一款.NET开源(MIT License)、免费、功能强大的Windows快速文件搜索和应用程序启动器:Flow Launcher。
|
11天前
|
C#
.NET开源、免费、强大的交互式绘图库
.NET开源、免费、强大的交互式绘图库
|
11天前
|
存储 文字识别 C#
.NET开源免费、功能强大的 Windows 截图录屏神器
今天大姚给大家分享一款.NET开源免费(基于GPL3.0开源协议)、功能强大、简洁灵活的 Windows 截图、录屏、Gif动图制作神器:ShareX。
|
11天前
|
数据可视化 开发工具 C#
.NET开源、免费、跨平台的Git可视化管理工具
俗话说得好“工欲善其事,必先利其器”,合理的选择和使用可视化的管理工具可以降低技术入门和使用的门槛。今天大姚给大家分享一款.NET Avalonia开源、免费、跨平台、快速的Git可视化管理工具:SourceGit。
|
2月前
|
开发框架 JavaScript 前端开发
5个.NET开源且强大的快速开发框架(帮助你提高生产效率)
5个.NET开源且强大的快速开发框架(帮助你提高生产效率)
|
11天前
|
搜索推荐 API C#
.NET开源快速、强大、免费的电子表格组件
.NET开源快速、强大、免费的电子表格组件
|
2月前
|
Linux C# Android开发
.NET Avalonia开源、免费的桌面UI库 - SukiUI
.NET Avalonia开源、免费的桌面UI库 - SukiUI
|
1月前
|
C# 开发者
.NET开源的两款第三方登录整合库
.NET开源的两款第三方登录整合库
|
2月前
|
安全 C# 开发者
.NET开源的一键自动化下载、安装、激活Microsoft Office利器
.NET开源的一键自动化下载、安装、激活Microsoft Office利器
|
2月前
|
C# Windows
.NET开源的一个小而快并且功能强大的 Windows 动态桌面软件
.NET开源的一个小而快并且功能强大的 Windows 动态桌面软件