热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

上个月对Math.NET的基本使用进行了介绍,主要内容有矩阵,向量的相关操作,解析数据格式,数值积分,数据统计,相关函数,求解线性方程组以及随机数发生器的相关内容。这个月接着深入发

               本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html

开源Math.NET基础数学类库使用总目录:http://www.cnblogs.com/asxinyu/p/4329737.html 

  上个月对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分解算法,的抽象 基类:

 1 internal abstract class Cholesky : Cholesky<double>
 2 {
 3     protected Cholesky(Matrix<double> factor)
 4         : base(factor)
 5     {
 6     }
 7 
 8     /// 
 9     /// Gets the determinant of the matrix for which the Cholesky matrix was computed.
10     /// 
11     public override double Determinant
12     {
13         get
14         {
15             var det = 1.0;
16             for (var j = 0; j )
17             {
18                 var d = Factor.At(j, j);
19                 det *= d*d;
20             }
21 
22             return det;
23         }
24     }
25 
26     /// 
27     /// Gets the log determinant of the matrix for which the Cholesky matrix was computed.
28     /// 
29     public override double DeterminantLn
30     {
31         get
32         {
33             var det = 0.0;
34             for (var j = 0; j )
35             {
36                 det += 2*Math.Log(Factor.At(j, j));
37             }
38 
39             return det;
40         }
41     }
42 }

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

 1 internal sealed class DenseCholesky : Cholesky
 2 {       
 3     public static DenseCholesky Create(DenseMatrix matrix)
 4     {
 5         if (matrix.RowCount != matrix.ColumnCount)
 6         {
 7             throw new ArgumentException(Resources.ArgumentMatrixSquare);
 8         }
 9         var factor = (DenseMatrix) matrix.Clone();
10         Control.LinearAlgebraProvider.CholeskyFactor(factor.Values, factor.RowCount);
11         return new DenseCholesky(factor);
12     }
13 
14     DenseCholesky(Matrix<double> factor): base(factor)  {      }
15     
16     public override void Solve(Matrix<double> input, Matrix<double> result)
17     {
18         if (result.RowCount != input.RowCount)
19         {
20             throw new ArgumentException(Resources.ArgumentMatrixSameRowDimension);
21         }
22 
23         if (result.ColumnCount != input.ColumnCount)
24         {
25             throw new ArgumentException(Resources.ArgumentMatrixSameColumnDimension);
26         }
27 
28         if (input.RowCount != Factor.RowCount)
29         {
30             throw Matrix.DimensionsDontMatch(input, Factor);
31         }
32 
33         var dinput = input as DenseMatrix;
34         if (dinput == null)
35         {
36             throw new NotSupportedException("Can only do Cholesky factorization for dense matrices at the moment.");
37         }
38 
39         var dresult = result as DenseMatrix;
40         if (dresult == null)
41         {
42             throw new NotSupportedException("Can only do Cholesky factorization for dense matrices at the moment.");
43         }
44         Buffer.BlockCopy(dinput.Values, 0, dresult.Values, 0, dinput.Values.Length*Constants.SizeOfDouble);
45         var dfactor = (DenseMatrix) Factor;
46         Control.LinearAlgebraProvider.CholeskySolveFactored(dfactor.Values, dfactor.RowCount, dresult.Values, dresult.ColumnCount);
47     }
48 
49     public override void Solve(Vector<double> input, Vector<double> result)
50     {
51         if (input.Count != result.Count)
52         {
53             throw new ArgumentException(Resources.ArgumentVectorsSameLength);
54         }
55 
56         if (input.Count != Factor.RowCount)
57         {
58             throw Matrix.DimensionsDontMatch(input, Factor);
59         }
60 
61         var dinput = input as DenseVector;
62         if (dinput == null)
63         {
64             throw new NotSupportedException("Can only do Cholesky factorization for dense vectors at the moment.");
65         }
66         var dresult = result as DenseVector;
67         if (dresult == null)
68         {
69             throw new NotSupportedException("Can only do Cholesky factorization for dense vectors at the moment.");
70         }
71 
72         Buffer.BlockCopy(dinput.Values, 0, dresult.Values, 0, dinput.Values.Length*Constants.SizeOfDouble);
73 
74         var dfactor = (DenseMatrix) Factor;
75         Control.LinearAlgebraProvider.CholeskySolveFactored(dfactor.Values, dfactor.RowCount, dresult.Values, 1);
76     }
77 }

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

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

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

 1 // 格式设置
 2 var formatProvider = (CultureInfo)CultureInfo.InvariantCulture.Clone();
 3 formatProvider.TextInfo.ListSeparator = " ";
 4 
 5 //创建一个随机的矩阵
 6 var matrix = new DenseMatrix(5);
 7 var rnd = new Random(1); 
 8 for (var i = 0; i )
 9 {
10     for (var j = 0; j )
11     {
12         matrix[i, j] = rnd.NextDouble();
13     }
14 }
15 // 计算行列式
16 Console.WriteLine(@"1. 行列式 结果为");
17 Console.WriteLine(matrix.Determinant());
18 Console.WriteLine();

  输出结果为:

1. 行列式 结果为
0.0349730711309253

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

 1 var formatProvider = (CultureInfo)CultureInfo.InvariantCulture.Clone();
 2 formatProvider.TextInfo.ListSeparator = " ";
 3 
 4 //创建矩阵
 5 var matrix = DenseMatrix.OfArray(new[,] { { 2.0, 1.0 }, { 1.0, 2.0 } });
 6 Console.WriteLine(@"原始矩阵");
 7 Console.WriteLine(matrix.ToString("#0.00\t", formatProvider));
 8 Console.WriteLine();
 9 
10 //cholesky分解对象
11 var cholesky = matrix.Cholesky();
12 
13 //计算行列式
14 Console.WriteLine(@"矩阵行列式");
15 Console.WriteLine(cholesky.Determinant);
16 Console.WriteLine();

结果如下:

1 原始矩阵
2 DenseMatrix 2x2-Double
3 2.00      1.00
4 1.00      2.00
5 
6 矩阵行列式
7 3
4.资源

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

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


推荐阅读
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
author-avatar
梧桐树信息科技
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有