博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【原创】开源Math.NET基础数学类库使用(02)矩阵向量计算
阅读量:6976 次
发布时间:2019-06-27

本文共 6120 字,大约阅读时间需要 20 分钟。

               本博客所有文章分类的总目录: 

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

前言

  本文开始一一介绍Math.NET的几个主要子项目的相关功能的使用。今天先要介绍的是最基本Math.NET Numerics的最基本矩阵与向量计算。

  如果本文章资源下载不了,或者文章显示有问题,请参考 : 

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
:IFormattable, IEquatable
>, IList, IList
2 where T : struct, IEquatable
, IFormattable3 public abstract partial class Matrix
:IFormattable, IEquatable
> 4 where T : struct, IEquatable
, IFormattable

 创建也很简单,可以大概看看下面这段代码,构造函数还有更多的用法,不一一演示,要自己研究下源代码,记得要引用MathNet.Numerics.LinearAlgebra命名空间:

1 //初始化一个矩阵和向量的构建对象 2 var mb = Matrix
.Build; 3 var vb = Vector
.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
operator +(Matrix
rightSide) 2 { 3 return rightSide.Clone(); 4 } 5 public static Matrix
operator -(Matrix
rightSide) 6 { 7 return rightSide.Negate(); 8 } 9 public static Matrix
operator *(Matrix
leftSide, T rightSide)10 {11 return leftSide.Multiply(rightSide);12 }13 public static Matrix
operator /(T dividend, Matrix
divisor)14 {15 return divisor.DivideByThis(dividend);16 }

 矩阵的相关操作是线性代数的核心和基础,而Matrix的基础功能也是非常强大的,我们看看Matrix的关于矩阵操作的相关代码,不仅包括常见矩阵分解算法,如LU,QR,Cholesky等,而且还包括一些线性方程的求解,都是可以直接通过实例方法进行的,看看抽象类的方法原型,具体的代码在Matrix.Solve.cs文件中:

1 public abstract Cholesky
Cholesky(); 2 public abstract LU
LU(); 3 public abstract QR
QR(QRMethod method = QRMethod.Thin); 4 public abstract GramSchmidt
GramSchmidt(); 5 public abstract Svd
Svd(bool computeVectors = true); 6 public abstract Evd
Evd(Symmetricity symmetricity = Symmetricity.Unknown); 7 public void Solve(Vector
input, Vector
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
input, Matrix
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
Solve(Matrix
input)27 {28 var x = Build.SameAs(this, ColumnCount, input.ColumnCount);29 Solve(input, x);30 return x;31 }32 public Vector
Solve(Vector
input)33 {34 var x = Vector
.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://btupl.baihongyu.com/

你可能感兴趣的文章
jQuery EasyUI 表单插件 - Datebox 日期框
查看>>
要哭了,模拟器键盘一直不显示
查看>>
获取下个月的今天
查看>>
elasticsearch简介
查看>>
文件分区格式化及挂载
查看>>
Centos运行级别和开机过程
查看>>
Linux 装B之作酷炫小工具
查看>>
Citrix Avalon安装实验手册之一----Avalon概述及实验环境准备
查看>>
动态表单构建器——建造者模式
查看>>
Android 自动化测试
查看>>
MySQL 5.5 服务器变量详解(二)
查看>>
bootstrap table
查看>>
CentOS 7 yum 安装 MySQL5.7
查看>>
企业网络翻译官——DNS
查看>>
RocketMQ3.2.2生产者发送消息自动创建Topic队列数无法超过4个
查看>>
USG防火墙telnet实验
查看>>
[给12306支招]取消车票预订-采用全额预售(充值)
查看>>
linux下使profile和.bash_profile立即生效的方法
查看>>
Operations Manager 2012 SP1配置部署系列之(二) SCOM监控SCVMM
查看>>
父域与子域之的信任关系
查看>>