本博客所有文章分类的总目录:【总目录】本博客博文总目录-实时更新 

开源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(,);
  7. //向量相当于是一个一维数组,只有长度
  8. var vector0 = vb.Random();//也可以选择分布
  9.  
  10. //矩阵还可以这样初始化
  11. var matrix1 = mb.Dense(,,0.55);
  12. //使用函数初始化
  13. var matrix2 = mb.Dense(,,(i,j)=>*i + j );
  14.  
  15. //对角矩阵
  16. var diagMaxtrix = mb.DenseDiagonal(,,);
  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 -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.  
  16. diagMaxtrix: DenseMatrix 3x3-Double
  17.  
  18. fromArray: DenseMatrix 2x2-Double

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. //矩阵与向量相乘 左乘 也可以使用LeftMultiply
  23. resultV = vector * matrixA;
  24.  
  25. //2个矩阵相乘,要注意矩阵乘法的维数要求
  26. resultM = matrixA * matrixB;//也可以使用Multiply方法
  27. Console.WriteLine(@"Multiply matrix by matrix using operator *. (result = A * B)");
  28. Console.WriteLine(resultM.ToString("#0.00\t", formatProvider));
  29. Console.WriteLine();
  30.  
  31. //矩阵加法 使用 + ,或者Add方法
  32. resultM = matrixA + matrixB;
  33. resultM = (DenseMatrix)matrixA.Add(matrixB);
  34.  
  35. //矩阵减法 使用 - ,或者Subtract方法
  36. resultM = matrixA - matrixB;
  37. resultM = (DenseMatrix)matrixA.Subtract(matrixB);
  38.  
  39. //矩阵除法,使用 Divide
  40. 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. Multiply matrix by matrix using operator *. (result = A * B)
  8. DenseMatrix 3x3-Double
  9. 14.00 26.00 38.00
  10. 32.00 62.00 92.00
  11. 50.00 98.00 146.00

4.资源

  资源大家可以去本系列文章的首页进行下载:

  如果本文章资源或者显示有问题,请参考本文原文地址http://www.cnblogs.com/asxinyu/p/4265406.html

【原创】开源Math.NET基础数学类库使用(02)矩阵向量计算的更多相关文章

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

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

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

    本博客所有文章分类的总目录链接:[总目录]本博客博文总目录-实时更新  1.开源Math.NET数学组件文章   1.开源Math.NET基础数学类库使用(01)综合介绍   2.开源Math.NET ...

  3. 【原创】开源Math.NET基础数学类库使用(01)综合介绍

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  4. 【原创】开源Math.NET基础数学类库使用(03)C#解析Matlab的mat格式

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  5. 【原创】开源Math.NET基础数学类库使用(04)C#解析Matrix Marke数据格式

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  6. 【原创】开源Math.NET基础数学类库使用(05)C#解析Delimited Formats数据格式

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  7. 【原创】开源Math.NET基础数学类库使用(06)直接求解线性方程组

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  8. 【原创】开源Math.NET基础数学类库使用(07)常用的数学物理常数

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 1.前 ...

  9. 【原创】开源Math.NET基础数学类库使用(08)C#进行数值积分

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

随机推荐

  1. LintCode 78:Longest Common Prefix

      public class Solution { /** * @param strs: A list of strings * @return: The longest common prefix ...

  2. java爬虫:在请求body中增加json数据采集

    1,http://www.hqepay.com/public/expressquery.html 查询快递不是将键值对post过去,而是将json数据放到body中发送过去.抓包如下: 2,需要导入一 ...

  3. java基础3_循环语句,数组

    java中的循环: Java中提供了3中循环结构:  while  do-while  for ① 循环结构的作用? 可以不断重复执行循环结构中的代码: ② 上面的3个循环结构功能都是一样的,只是结构 ...

  4. angular 中父元素ng-repeat后子元素ng-click失效

    在angular中使用ng-repeat后ng-click失效,今天在这个上面踩坑了.特此记录一下. 因为ng-repeat创造了新的SCOPE.如果要使用这个scope的话就必须使用$parent来 ...

  5. [转]android:动态创建多个按钮 及 批量设置监听

    之前投机取巧,先创建好多个按钮,再根据需要的数量进行部分隐藏,不过还是逃不过呀. 这样根本无法批量地 findId,批量地 设置监听. 所以今天还是认认真真地研究回“动态创建按钮”,终于,通过不断尝试 ...

  6. CSS3总结

    1.圆角效果 border-radius: 1px 1px 1px 1px; /* 四个半径值分别是左上角.右上角.右下角和左下角.顺时针 */  右边半圆 div.right-circle{ hei ...

  7. pythonchallenge 解谜 Level 6

    第六关地址 http://www.pythonchallenge.com/pc/def/channel.html 和前几关一样,首先看网页源码吧.反正不看也没办法... <html>< ...

  8. 我的emacs配置

    我的emacs配置文件 ;; .emacs ;; ============================== Basic Configure START ====================== ...

  9. WPF整理-Style

    "Consistency in a user interface is an important trait; there are many facets of consistency,   ...

  10. CYQ.Data 快速开发之UI(赋值、取值、绑定)原理

    昨夜园子猴子问了几个我CYQ.Data使用的小问题,经过简单解答后,他表示“妈妈再也不用担心我的学习",并于事后以资鼓励,希望这框架越走越好. 除了技术上的交流,双方在生活,S上面的问题上也 ...