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

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

  上个月对Math.NET的基本使用进行了介绍,主要内容有矩阵,向量的相关操作,解析数据格式,数值积分,数据统计,相关函数,求解线性方程组以及随机数发生器的相关内容。这个月接着深入发掘Math.NET的各种功能,并对源代码进行分析,使得大家可以尽可能的使用Math.NET在.NET平台下轻易的开发数学计算相关的,或者可以将其中的源码快速移植到自己的系统中去(有时候并不需要所有的功能,只需要其中的部分功能代码),今天要介绍的是Math.NET中利用C#计算矩阵行列式的功能。

本文原文地址:http://www.cnblogs.com/asxinyu/p/4304289.html

1.行列式概念与性质

  行列式是关于方阵的元素所定义的一种运算,其运算的结果是一个数,称为方阵的行列式值,简称为方阵的行列式。

  行列式的概念最初是伴随着方程组的求解而发展起来的。行列式的提出可以追溯到十七世纪,最初的雏形由日本数学家关孝和与德国数学家戈特弗里德·莱布尼茨各自独立得出,时间大致相同。日本数学家关孝和提出来的,他在1683年写了一部名为解伏题之法的著作,意思是“解行列式问题的方法”,书中对行列式的概念和它的展开已经有了清楚的叙述。欧洲第一个提出行列式概念的是德国数学家,微积分学奠基人之一莱布尼茨

  行列式是线性代数里面的一个基本概念,我们可以从其定义和性质中了解一下其作用:

1.行列式与它的转置行列式相等;

2.互换行列式的两行(列),行列式变号;

3.行列式的某一行(列)的所有的元素都乘以同一数k,等于用数k乘此行列式;

4.行列式如果有两行(列)元素成比例,则此行列式等于零;

5.若行列式的某一列(行)的元素都是两数之和,则这个行列式是对应两个行列式的和;

6.把行列式的某一列(行)的各元素乘以同一数然后加到另一列(行)对应的元素上去,行列式不变

2.Math.NET计算行列式的实现

  Math.NET在对行列式的计算过程中,只是把其作为矩阵计算的一个小部分功能,作为属性添加在各个矩阵分解算法的抽象和实现类中。因为Math.NET中矩阵的泛型类型的相关实现主要是支持Double和Float类型,所以基本上与泛型相关的类都实现了2个版本,在实际使用时再进行调用。而矩阵分解算法如:Cholesky,LU,QR,Svd等都有一个抽象泛型基类。在这些抽象类中都定义好了矩阵分解相关的计算,如行列式,方程求解等功能,然后对类进行继承,如Cholesky分解算法,的抽象 基类:

 internal abstract class Cholesky : Cholesky<double>
{
protected Cholesky(Matrix<double> factor)
: base(factor)
{
} /// <summary>
/// Gets the determinant of the matrix for which the Cholesky matrix was computed.
/// </summary>
public override double Determinant
{
get
{
var det = 1.0;
for (var j = ; j < Factor.RowCount; j++)
{
var d = Factor.At(j, j);
det *= d*d;
} return det;
}
} /// <summary>
/// Gets the log determinant of the matrix for which the Cholesky matrix was computed.
/// </summary>
public override double DeterminantLn
{
get
{
var det = 0.0;
for (var j = ; j < Factor.RowCount; j++)
{
det += *Math.Log(Factor.At(j, j));
} return det;
}
}
}

这个基类就是继承实现的Doule类型的版本,然后DenseCholesky继承该类,实现更多的计算功能:

 internal sealed class DenseCholesky : Cholesky
{
public static DenseCholesky Create(DenseMatrix matrix)
{
if (matrix.RowCount != matrix.ColumnCount)
{
throw new ArgumentException(Resources.ArgumentMatrixSquare);
}
var factor = (DenseMatrix) matrix.Clone();
Control.LinearAlgebraProvider.CholeskyFactor(factor.Values, factor.RowCount);
return new DenseCholesky(factor);
} DenseCholesky(Matrix<double> factor): base(factor) { } public override void Solve(Matrix<double> input, Matrix<double> result)
{
if (result.RowCount != input.RowCount)
{
throw new ArgumentException(Resources.ArgumentMatrixSameRowDimension);
} if (result.ColumnCount != input.ColumnCount)
{
throw new ArgumentException(Resources.ArgumentMatrixSameColumnDimension);
} if (input.RowCount != Factor.RowCount)
{
throw Matrix.DimensionsDontMatch<ArgumentException>(input, Factor);
} var dinput = input as DenseMatrix;
if (dinput == null)
{
throw new NotSupportedException("Can only do Cholesky factorization for dense matrices at the moment.");
} var dresult = result as DenseMatrix;
if (dresult == null)
{
throw new NotSupportedException("Can only do Cholesky factorization for dense matrices at the moment.");
}
Buffer.BlockCopy(dinput.Values, , dresult.Values, , dinput.Values.Length*Constants.SizeOfDouble);
var dfactor = (DenseMatrix) Factor;
Control.LinearAlgebraProvider.CholeskySolveFactored(dfactor.Values, dfactor.RowCount, dresult.Values, dresult.ColumnCount);
} public override void Solve(Vector<double> input, Vector<double> result)
{
if (input.Count != result.Count)
{
throw new ArgumentException(Resources.ArgumentVectorsSameLength);
} if (input.Count != Factor.RowCount)
{
throw Matrix.DimensionsDontMatch<ArgumentException>(input, Factor);
} var dinput = input as DenseVector;
if (dinput == null)
{
throw new NotSupportedException("Can only do Cholesky factorization for dense vectors at the moment.");
}
var dresult = result as DenseVector;
if (dresult == null)
{
throw new NotSupportedException("Can only do Cholesky factorization for dense vectors at the moment.");
} Buffer.BlockCopy(dinput.Values, , dresult.Values, , dinput.Values.Length*Constants.SizeOfDouble); var dfactor = (DenseMatrix) Factor;
Control.LinearAlgebraProvider.CholeskySolveFactored(dfactor.Values, dfactor.RowCount, dresult.Values, );
}
}

这里只是介绍了具体行列式计算的实现,其实在Math.NET中这种实现只要在调试的时候搞懂了其中一个,其他相关的都好懂了。调用的时候,由于矩阵的类型里面都有相关的属性,可以直接继续计算,下面就演示一下如何调用计算行列式。

3.矩阵行列式计算的调用代码

  在矩阵类Martix中,已经有一个属性Determinant可以直接获取矩阵的行列式,所以计算也非常简单:

 // 格式设置
var formatProvider = (CultureInfo)CultureInfo.InvariantCulture.Clone();
formatProvider.TextInfo.ListSeparator = " "; //创建一个随机的矩阵
var matrix = new DenseMatrix();
var rnd = new Random();
for (var i = ; i < matrix.RowCount; i++)
{
for (var j = ; j < matrix.ColumnCount; j++)
{
matrix[i, j] = rnd.NextDouble();
}
}
// 计算行列式
Console.WriteLine(@"1. 行列式 结果为");
Console.WriteLine(matrix.Determinant());
Console.WriteLine();

  输出结果为:

. 行列式 结果为
0.0349730711309253

  如果要使用特殊的分解算法类计算行列式,也可以单独计算,例如下面的代码,先利用matrix对象生成一个Cholesky分解算法的对象,然后用它来计算行列式:

 var formatProvider = (CultureInfo)CultureInfo.InvariantCulture.Clone();
formatProvider.TextInfo.ListSeparator = " "; //创建矩阵
var matrix = DenseMatrix.OfArray(new[,] { { 2.0, 1.0 }, { 1.0, 2.0 } });
Console.WriteLine(@"原始矩阵");
Console.WriteLine(matrix.ToString("#0.00\t", formatProvider));
Console.WriteLine(); //cholesky分解对象
var cholesky = matrix.Cholesky(); //计算行列式
Console.WriteLine(@"矩阵行列式");
Console.WriteLine(cholesky.Determinant);
Console.WriteLine();

结果如下:

 原始矩阵
DenseMatrix 2x2-Double
2.00 1.00
1.00 2.00 矩阵行列式

4.资源

  资源包括源代码以及案例都可以去官网下载,下载地址本系列文章的目录中第一篇文章:http://www.cnblogs.com/asxinyu/p/4264638.html,有介绍。由于源码很大,如果找不到相应的案例,可以进行搜索,可以比较快的找到相应的代码。

【原创】开源Math.NET基础数学类库使用(15)C#计算矩阵行列式的更多相关文章

  1. 开源Math.NET基础数学类库使用(15)C#计算矩阵行列式

    原文:[原创]开源Math.NET基础数学类库使用(15)C#计算矩阵行列式                本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p ...

  2. 开源Math.NET基础数学类库使用(17)C#计算矩阵条件数

    原文:[原创]开源Math.NET基础数学类库使用(17)C#计算矩阵条件数                本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p ...

  3. 开源Math.NET基础数学类库使用(16)C#计算矩阵秩

    原文:[原创]开源Math.NET基础数学类库使用(16)C#计算矩阵秩                本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4 ...

  4. 【原创】开源Math.NET基础数学类库使用(16)C#计算矩阵秩

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

  5. 【原创】开源Math.NET基础数学类库使用(17)C#计算矩阵条件数

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

  6. 【原创】开源Math.NET基础数学类库使用(11)C#计算相关系数

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

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

    阅读目录 前言 1.Math.NET计算相关系数的类 2.Correlation的实现 3.使用案例 4.资源                本博客所有文章分类的总目录:[总目录]本博客博文总目录-实 ...

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

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

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

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

随机推荐

  1. 【BZOJ】4056: [Ctsc2015]shallot

    题意 在线.可持久化地维护一条二维平面上的折线,支持查询与任意一条直线的交点个数. 点的个数和操作个数小于\(10^5\) 分析 一条折线可以用一个序列表示,可持久化序列考虑用可持久化treap. 如 ...

  2. S3C2440UART之FIFO

    一.基础知识 S3C2440有3个独立的串口,每一个都可以利用DMA和中断方式操作.每个包含2个64字节FIFO,一个收,一个发.非FIFO模式相当于FIFO模式的一个寄存器缓冲模式.每一个UART有 ...

  3. hadoop---前期准备---屌丝

    hadoop要求有多台机子进行后续的数据处理,作为屌丝一枚,怎么才能搭建一个合适的环境学习hadoop?这就是本篇将要介绍的----前期准备. 搭建环境没啥好说的,说一下搭建环境多需要的吧 硬件:电脑 ...

  4. STM32之待机唤醒

    前段时间我稍微涉及节能减排大赛..倡导节能的社会..没错了.你真是太聪明了..知道了我今天要讲关于STM32节能方面的模块..没错..这标题已经告诉你了是吧..哦,对,标题有写..所以..言归正传.至 ...

  5. 日常关键字:定时关机、该任务映像已损坏或已篡改.(0x80041321)、ChaZD生词同步扇贝

    我在床上用chinanet网络慢得简直令人发指,12B/S.是的你没有看错,这是我最常看到的网速.但是我最近发现电脑联网开出一个WiFi,在床上用手机上网时,网速会一点提升,可达到1KB/S(⊙﹏⊙) ...

  6. Spark优化之二:集群上运行jar程序,状态一直Accepted且不停止不报错

    如果运行Spark集群时状态一直为Accepted且不停止不报错,比如像下面这样的情况: 15/06/14 11:33:33 INFO yarn.Client: Application report ...

  7. SQL执行效率2-执行计划

    以下语句可以进行SQL 语句执行时间分析,两个Go之间就是SQL查询语句 use Work--数据库名 go set statistics profile on set statistics io o ...

  8. 开源免费的HTML5游戏引擎

    青瓷引擎的成长 青瓷引擎自2015年4月项目启动开始,7月首次亮相2015年ChinaJoy,便得到业界的极大关注,随后开启限量测试,收到数百个开发者团队的试用申请及反馈,期间经历了18个内测版本,完 ...

  9. 安装wampserver遇到,无法启动此程序,丢失MSVCR110.dll

    这个问题遇到多次了,根据网上的解决办法,下载这个动态链接库文件,安装到指定位置重启系统后还是解决不了,其实这个文件有时候是存在的也会出现这个问题.问题截图如下 其实这个我认为是系统缺少了相关组组件的安 ...

  10. gitlab使用有感之坚持

    当老师请大二的学弟教我们使用这个软件的时候, 当时就吓坏我了,感觉好高大上的样子,全英文的,还有什么阿里云的服务器用来代码管理:心情一下子就不好了,感觉自己懂得东西好少啊,比学弟懂得都少,跟不上时代的 ...