降阶法计算行列式方法有个地方有Bug(原文也已更正,此为更正后部分)

今天用此函数做方程求解时发现有误,特此更正:
/// <summary>
        /// 降阶法计算行列式
        /// </summary>
        /// <param name="Determinants">N阶行列式</param>
        /// <param name="ZeroOptimization">是否0优化</param>
        /// <returns>计算结果</returns>
        public static decimal CalcDeterminantAij(decimal[,] Determinants, bool ZeroOptimization = false)
        {
            var theN = Determinants.GetLength(0);
            //如果为2阶,直接计算
            if (theN == 2)
            {
                return Determinants[0, 0] * Determinants[1, 1] - Determinants[0, 1] * Determinants[1, 0];
            }
            if (theN == 1)
            {
                return Determinants[0, 0];
            }
            if (theN == 0)
            {
                throw new Exception("参数错误!");
            }
            if (ZeroOptimization)
            {
                //找0最多的行
                int theRowIndex = 0;
                int theMaxZeroCountR = -1;
                for (int i = 0; i < theN; i++)
                {
                    int theZeroNum = 0;
                    for (int j = 0; j < theN; j++)
                    {
                        if (Determinants[i, j] == 0)
                        {
                            theZeroNum++;
                        }
                    }
                    if (theZeroNum > theMaxZeroCountR)
                    {
                        theRowIndex = i;
                        theMaxZeroCountR = theZeroNum;
                    }
                }
                //找0最多的列
                int theColIndex = 0;
                int theMaxZeroCountC = -1;
                for (int i = 0; i < theN; i++)
                {
                    int theZeroNum = 0;
                    for (int j = 0; j < theN; j++)
                    {
                        if (Determinants[j, i] == 0)
                        {
                            theZeroNum++;
                        }
                    }
                    if (theZeroNum > theMaxZeroCountC)
                    {
                        theColIndex = i;
                        theMaxZeroCountC = theZeroNum;
                    }
                }
                if (theMaxZeroCountR >= theMaxZeroCountC)
                {
                    decimal theRetDec = 0;
                    //第i=theRowIndex+1行展开
                    int i = theRowIndex + 1;
                    for (int j = 1; j <= theN; j++)
                    {
                        var theSign = CalcDeterMijSign(i, j);
                        var theNewMij = GetDeterminantMij(Determinants, i, j);
                        theRetDec += theSign * Determinants[i - 1, j - 1] * CalcDeterminantAij(theNewMij, ZeroOptimization);
                    }
                    return theRetDec;
                }
                else
                {
                    decimal theRetDec = 0;
                    //第j=theColIndex+1列展开
                    int j = theColIndex + 1;
                    for (int i = 1; i <= theN; i++)
                    {
                        var theSign = CalcDeterMijSign(i, j);
                        var theNewMij = GetDeterminantMij(Determinants, i, j);
                        theRetDec += theSign * Determinants[i, j] * CalcDeterminantAij(theNewMij, ZeroOptimization);
                    }
                    return theRetDec;
                }
            }
            else
            {
                //采用随机法展开一行
                var i = new Random().Next(1, theN);
                decimal theRetDec = 0;
                for (int j = 1; j <= theN; j++)
                {
                    var theSign = CalcDeterMijSign(i, j);
                    var theNewMij = GetDeterminantMij(Determinants, i, j);
                    //此处修改theRetDec += theSign * Determinants[i, j] * CalcDeterminantAij(theNewMij, ZeroOptimization);
                    theRetDec += theSign * Determinants[i-1, j-1] * CalcDeterminantAij(theNewMij, ZeroOptimization);
                }
                return theRetDec;
            }
        }

时间: 2024-10-05 04:35:08

降阶法计算行列式方法有个地方有Bug(原文也已更正,此为更正后部分)的相关文章

[再寄小读者之数学篇](2014-05-26 计算行列式)

(来自 succeme) A 是给定的方阵,特征值已知,其他小写字母为复数,用A 的特征值表出下列行列式的值: ????????b0Eabn?1An?1abn?2An?2?ab1Ab1Ab0Eabn?1An?1?ab2A2b2A2b1Ab0E?ab3A3?????bn?1An?1bn?2An?2bn?3An?3?b0E???????? 解答: (来自 torsor) 首先,若 a=0 , 则所求矩阵是分块上三角阵,容易看出其行列式等于 bn20 . 以下设 a≠0 , 并且 ω1,?,ωn 是

利用“三角化”计算行列式快速求解程序(验证过很多题目的,绝对准确)

#include<iostream>#include<cmath>using namespace std;void main(){ //输入行列式开始 int n,i,j,a[10][10],T[10],max[10],b[10],k,q,p; float t[10][10],c,sum=-1; cout<<"阶数:"; cin>>n; cout<<"行列式:"<<endl; for(i=1;i

字符串相似度计算的方法,使用SQL以及C#实现,本文非原创摘自网络(.NET SQL技术交流群入群206656202需注明博客园)

1 CREATE function get_semblance_By_2words 2 ( 3 @word1 varchar(50), 4 @word2 varchar(50) 5 ) 6 returns nvarchar(4000) 7 as 8 begin 9 declare @re int 10 declare @maxLenth int 11 declare @i int,@l int 12 declare @tb1 table(child varchar(50)) 13 declare

6_资金收支计算的方法

资金收支计算书的目的  当年度的所有活动对应的所有收入和支出的内容明细. 当年度支付资金的详细. 1,2的矛盾:.所以需要有调整的存在.  1会含有实际上没有支付资金变化的交易(未付/未收金). 2会含有非本年度活动但是今年发生的支付资金变化的交易. 支付资金:现金,随时都能使用的预金. 资产的支出和消费的支出的区别 是记录在固定资产勘定(设备相关支出)上,消耗品费或维修费的经费勘定(消费的支出)上.6_资金收支计算的方法

递归的学习(计算行列式、汉诺塔问题)

不过多说,直接看图. 1 计算行列式,代码如下 : 2 汉诺塔问题 刚开始学习时没有想明白下面的代码是如何进行递归的,经过手写后慢慢就理解了它是如何进行递归的,以及它执行的顺序.上图为代码(从网上搜集整理的),下图为手稿. 原文地址:https://www.cnblogs.com/whlkx/p/9165125.html

NHibernate 的 SetResultTransformer 方法在Oracle下的Bug修复

NHibernate 的 SetResultTransformer 方法在Oracle下会出现"Could not find a setter for property"错误,这是Nhibernate在Oracle下使用的一个Bug.针对此Bug我可以自己进行修复. 下载NHibernate源码,将Property下的"ChainedPropertyAccessor.cs"稍作修改就会修复此Bug,代码如下: using System; namespace NHib

Android中8种异步处理与计算的方法

注:该文章翻译自Ali Muzaffar的文章<8 ways to do asynchronous processing in Android and counting>  Android提供了许多API来支持异步处理的功能,结合着Java提供的方法和你手上拥有的,估计目前已经有数十种进行异步任务的方法. 目前的趋势是仅使用Java的threads或者Android的AsyncTask来处理各种问题.虽然上述两种方法拥有较高的知名度,但是并非所有的API都适合,为你的需求选择最合适的方法能够使

文本相似度计算基本方法小结

在计算文本相似项发现方面,有以下一些可参考的方法.这些概念和方法会帮助我们开拓思路. 相似度计算方面 Jaccard相似度:集合之间的Jaccard相似度等于交集大小与并集大小的比例.适合的应用包括文档文本相似度以及顾客购物习惯的相似度计算等. Shingling:k-shingle是指文档中连续出现的任意k个字符.如果将文档表示成其k-shingle集合,那么就可以基于集合之间的 Jaccard相似度来计算文档之间的文本相似度.有时,将shingle哈希成更短的位串非常有用,可以基于这些哈希值

Gdal库计算形心方法。

在Gdal库中计算形心的方法如下: int OGRGeometry::Centroid( OGRPoint *poPoint ) const 其函数实现中,是调用的Geos库中的GEOSGetCentroid()方法,最终在Geos的bool Geometry::getCentroid(Coordinate& ret) const函数中创建了CentroidArea对象,并将几何对象添加进去,获取到其形心.代码如下: CentroidArea cent; cent.add(this); if (