开源Math.NET基础数学类库使用(02)矩阵向量计算
原文:【原创】开源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> 是抽象类型, 要通过其他方法去初始化。可以看看源码中的定义:
public abstract partial class Vector<T> :IFormattable, IEquatable<Vector<T>>, IList, IList<T>
where T : struct, IEquatable<T>, IFormattable
public abstract partial class Matrix<T> :IFormattable, IEquatable<Matrix<T>>
where T : struct, IEquatable<T>, IFormattable
创建也很简单,可以大概看看下面这段代码,构造函数还有更多的用法,不一一演示,要自己研究下源代码,记得要引用MathNet.Numerics.LinearAlgebra命名空间:
//初始化一个矩阵和向量的构建对象
var mb = Matrix<double>.Build;
var vb = Vector<double>.Build; //获取随机矩阵,也可以设置随机数所属的分布
var randomMatrix = mb.Random(,);
//向量相当于是一个一维数组,只有长度
var vector0 = vb.Random();//也可以选择分布 //矩阵还可以这样初始化
var matrix1 = mb.Dense(,,0.55);
//使用函数初始化
var matrix2 = mb.Dense(,,(i,j)=>*i + j ); //对角矩阵
var diagMaxtrix = mb.DenseDiagonal(,,); Console.WriteLine("randomMatrix: "+randomMatrix.ToString());
Console.WriteLine("vector0: "+vector0.ToString());
Console.WriteLine("matrix1: "+matrix1.ToString());
Console.WriteLine("matrix2: "+matrix2.ToString());
Console.WriteLine("diagMaxtrix: "+diagMaxtrix.ToString()); //当然也可以直接从数组中创建
double[,] x = {{ 1.0, 2.0 },{ 3.0, 4.0 }};
var fromArray = mb.DenseOfArray(x); Console.WriteLine("fromArray: "+fromArray.ToString());
结果如下,顺便说一下,Matrix和Vector对象已经对ToString进行了重载,以比较标准化的格式化字符串输出,很方便显示和观察:
randomMatrix: DenseMatrix 2x3-Double
0.785955 0.168426 -0.752291
0.878987 -0.220992 0.0911499 vector0: DenseVector -Double
-0.47651
-0.42378
-0.182919 matrix1: DenseMatrix 2x2-Double
0.55 0.55
0.55 0.55 matrix2: DenseMatrix 2x3-Double diagMaxtrix: DenseMatrix 3x3-Double fromArray: DenseMatrix 2x2-Double
2.矩阵与向量的算术运算
Matrix和Vector都支持常见的操作运算符号:+ ,- , * ,/ ,%等。我们可以从源码中看到部分这样的结构,限于篇幅,只简单列举几个重载操作符的方法,详细的源码在Matrix.Operators.cs文件:
public static Matrix<T> operator +(Matrix<T> rightSide)
{
return rightSide.Clone();
}
public static Matrix<T> operator -(Matrix<T> rightSide)
{
return rightSide.Negate();
}
public static Matrix<T> operator *(Matrix<T> leftSide, T rightSide)
{
return leftSide.Multiply(rightSide);
}
public static Matrix<T> operator /(T dividend, Matrix<T> divisor)
{
return divisor.DivideByThis(dividend);
}
矩阵的相关操作是线性代数的核心和基础,而Matrix的基础功能也是非常强大的,我们看看Matrix的关于矩阵操作的相关代码,不仅包括常见矩阵分解算法,如LU,QR,Cholesky等,而且还包括一些线性方程的求解,都是可以直接通过实例方法进行的,看看抽象类的方法原型,具体的代码在Matrix.Solve.cs文件中:
public abstract Cholesky<T> Cholesky();
public abstract LU<T> LU();
public abstract QR<T> QR(QRMethod method = QRMethod.Thin);
public abstract GramSchmidt<T> GramSchmidt();
public abstract Svd<T> Svd(bool computeVectors = true);
public abstract Evd<T> Evd(Symmetricity symmetricity = Symmetricity.Unknown);
public void Solve(Vector<T> input, Vector<T> result)
{
if (ColumnCount == RowCount)
{
LU().Solve(input, result);
return;
}
QR().Solve(input, result);
}
public void Solve(Matrix<T> input, Matrix<T> result)
{
if (ColumnCount == RowCount)
{
LU().Solve(input, result);
return;
}
QR().Solve(input, result);
} public Matrix<T> Solve(Matrix<T> input)
{
var x = Build.SameAs(this, ColumnCount, input.ColumnCount);
Solve(input, x);
return x;
}
public Vector<T> Solve(Vector<T> input)
{
var x = Vector<T>.Build.SameAs(this, ColumnCount);
Solve(input, x);
return x;
}
3.矩阵计算综合例子
上面的一些说明可以看到一些基本的方法情况,下面有一个实际的例子,说明基本的矩阵运算情况,当然更多高级的功能不能在一篇里面一一讲到,后续还会逐步挖掘其他使用。上代码:
// 格式
var formatProvider = (CultureInfo)CultureInfo.InvariantCulture.Clone();
formatProvider.TextInfo.ListSeparator = " "; //创建A,B矩阵
var matrixA = DenseMatrix.OfArray(new[,] { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 }, { 7.0, 8.0, 9.0 } });
var matrixB = DenseMatrix.OfArray(new[,] { { 1.0, 3.0, 5.0 }, { 2.0, 4.0, 6.0 }, { 3.0, 5.0, 7.0 } }); //矩阵与标量相乘 ,使用运算符 *
var resultM = 3.0 * matrixA;
Console.WriteLine(@"Multiply matrix by scalar using operator *. (result = 3.0 * A)");
Console.WriteLine(resultM.ToString("#0.00\t", formatProvider));
Console.WriteLine(); //使用Multiply相乘,结果和上面一样
resultM = (DenseMatrix)matrixA.Multiply(3.0); //矩阵与向量相乘 右乘
var vector = new DenseVector(new[] { 1.0, 2.0, 3.0 });
var resultV = matrixA * vector; //矩阵与向量相乘 左乘 也可以使用LeftMultiply
resultV = vector * matrixA; //2个矩阵相乘,要注意矩阵乘法的维数要求
resultM = matrixA * matrixB;//也可以使用Multiply方法
Console.WriteLine(@"Multiply matrix by matrix using operator *. (result = A * B)");
Console.WriteLine(resultM.ToString("#0.00\t", formatProvider));
Console.WriteLine(); //矩阵加法 使用 + ,或者Add方法
resultM = matrixA + matrixB;
resultM = (DenseMatrix)matrixA.Add(matrixB); //矩阵减法 使用 - ,或者Subtract方法
resultM = matrixA - matrixB;
resultM = (DenseMatrix)matrixA.Subtract(matrixB); //矩阵除法,使用 Divide
resultM = (DenseMatrix)matrixA.Divide(3.0);
过程比较简单,结果这里只列出部分:
Multiply matrix by scalar using operator *. (result = 3.0 * A)
DenseMatrix 3x3-Double
3.00 6.00 9.00
12.00 15.00 18.00
21.00 24.00 27.00 Multiply matrix by matrix using operator *. (result = A * B)
DenseMatrix 3x3-Double
14.00 26.00 38.00
32.00 62.00 92.00
50.00 98.00 146.00
4.资源
资源大家可以去本系列文章的首页进行下载:
如果本文章资源或者显示有问题,请参考本文原文地址:http://www.cnblogs.com/asxinyu/p/4265406.html
本博客还有大量的.NET开源技术文章,您可能感兴趣:
5..NET平台机器学习组件-Infer.NET系列文章:链接
开源Math.NET基础数学类库使用(02)矩阵向量计算的更多相关文章
- 【原创】开源Math.NET基础数学类库使用(02)矩阵向量计算
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 【目录】开源Math.NET基础数学类库使用总目录
本博客所有文章分类的总目录链接:[总目录]本博客博文总目录-实时更新 1.开源Math.NET数学组件文章 1.开源Math.NET基础数学类库使用(01)综合介绍 2.开源Math.NET ...
- 【原创】开源Math.NET基础数学类库使用(15)C#计算矩阵行列式
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 上个月 ...
- 【原创】开源Math.NET基础数学类库使用(16)C#计算矩阵秩
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 上个月 ...
- 【原创】开源Math.NET基础数学类库使用(17)C#计算矩阵条件数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 上个月 ...
- 开源Math.NET基础数学类库使用(17)C#计算矩阵条件数
原文:[原创]开源Math.NET基础数学类库使用(17)C#计算矩阵条件数 本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p ...
- 开源Math.NET基础数学类库使用(16)C#计算矩阵秩
原文:[原创]开源Math.NET基础数学类库使用(16)C#计算矩阵秩 本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4 ...
- 开源Math.NET基础数学类库使用(15)C#计算矩阵行列式
原文:[原创]开源Math.NET基础数学类库使用(15)C#计算矩阵行列式 本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p ...
- 【原创】开源Math.NET基础数学类库使用(01)综合介绍
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
随机推荐
- A Game of Thrones(10) - Jon
Jon climbed the steps slowly, trying not to think that this might be the last time ever. Ghost padde ...
- Remote Desktop Organizer – 管理组织远程桌面 - 小众软件
http://www.appinn.com/remote-desktop-organizer/
- Hulu面试题解答——N位数去除K个数字(解法错误sorry)
给定一个N位数,比如12345,从里面去掉k个数字.得到一个N-k位的数.比如去掉2,4,得到135,去掉1,5.得到234.设计算法.求出全部得到的N-k位数里面最小的那一个. 写的代码例如以下,思 ...
- 获取Google音乐的具体信息(方便对Google音乐批量下载)
Google音乐都是正版音乐, 不像百度所有都是盗链, 并且死链也多. 但有一个麻烦就是要下载Google音乐的时候得一个一个的点击下载链接, 进入下载页面再点"下载", 才干下载 ...
- Python数据结构之注意事项
1.列表 列表是Python中使用最频繁的数据结构,列表提供很多函数操作,比如下标存取,分片,index,append,remove等等. 例如: list=[1,2,'hello','python ...
- SVN基于Maven的Web项目更新,本地过程详细解释
周围环境 MyEclipse:10.7 Maven:3.1.1 概要 最近在做项目,MyEclipse下载SVN基于上述Maven的Web问题,有时候搞了非常半天,Maven项目还是出现叉号,最后总结 ...
- UVA 12263 Rankings(拓扑排序)
给出一个n个数的序列1,然后有m个改动(a, b),在序列2中a跟b在序列中的相对顺序改变.求符合题意的序列2. 题中说道如果一个数的位置不确定,则输出‘?' ,仔细想想,这种情况是不会存在的,因为在 ...
- MYSQL正在使用select发现现场记录方法,包括一个逗号分隔的字符串
首先,我们创建一个逗号分隔字符串. CREATE TABLE test(id int(6) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),pname VARCHAR ...
- ZOJ 3822 Domination(概率dp 牡丹江现场赛)
题目链接:problemId=5376">http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5376 Edward ...
- 强大的PropertyGrid
PropertyGrid, 做工具一定要用这东西..... 把要编辑的对象看成类的话, 全部要编辑的属性就是成员 嗯嗯, 近期看了几眼Ogitor, 它对于PropertyGrid的使用就非常不错 全 ...