天天看點

開源Math.NET基礎數學類庫使用(15)C#計算矩陣行列式1.行列式概念與性質2.Math.NET計算行列式的實作3.矩陣行列式計算的調用代碼4.資源

  上個月對Math.NET的基本使用進行了介紹,主要内容有矩陣,向量的相關操作,解析資料格式,數值積分,資料統計,相關函數,求解線性方程組以及随機數發生器的相關内容。這個月接着深入發掘Math.NET的各種功能,并對源代碼進行分析,使得大家可以盡可能的使用Math.NET在.NET平台下輕易的開發數學計算相關的,或者可以将其中的源碼快速移植到自己的系統中去(有時候并不需要所有的功能,隻需要其中的部分功能代碼),今天要介紹的是Math.NET中利用C#計算矩陣行列式的功能。

  行列式是關于方陣的元素所定義的一種運算,其運算的結果是一個數,稱為方陣的行列式值,簡稱為方陣的行列式。
開源Math.NET基礎數學類庫使用(15)C#計算矩陣行列式1.行列式概念與性質2.Math.NET計算行列式的實作3.矩陣行列式計算的調用代碼4.資源

  行列式的概念最初是伴随着方程組的求解而發展起來的。行列式的提出可以追溯到十七世紀,最初的雛形由日本數學家關孝和與德國數學家戈特弗裡德·萊布尼茨各自獨立得出,時間大緻相同。日本數學家關孝和提出來的,他在1683年寫了一部名為解伏題之法的著作,意思是“解行列式問題的方法”,書中對行列式的概念和它的展開已經有了清楚的叙述。歐洲第一個提出行列式概念的是德國數學家,微積分學創始者之一萊布尼茨。

  行列式是線性代數裡面的一個基本概念,我們可以從其定義和性質中了解一下其作用:

1.行列式與它的轉置行列式相等; 2.互換行列式的兩行(列),行列式變号; 3.行列式的某一行(列)的所有的元素都乘以同一數k,等于用數k乘此行列式; 4.行列式如果有兩行(列)元素成比例,則此行列式等于零; 5.若行列式的某一列(行)的元素都是兩數之和,則這個行列式是對應兩個行列式的和; 6.把行列式的某一列(行)的各元素乘以同一數然後加到另一列(行)對應的元素上去,行列式不變

  Math.NET在對行列式的計算過程中,隻是把其作為矩陣計算的一個小部分功能,作為屬性添加在各個矩陣分解算法的抽象和實作類中。因為Math.NET中矩陣的泛型類型的相關實作主要是支援Double和Float類型,是以基本上與泛型相關的類都實作了2個版本,在實際使用時再進行調用。而矩陣分解算法如:Cholesky,LU,QR,Svd等都有一個抽象泛型基類。在這些抽象類中都定義好了矩陣分解相關的計算,如行列式,方程求解等功能,然後對類進行繼承,如Cholesky分解算法,的抽象 基類:

這個基類就是繼承實作的Doule類型的版本,然後DenseCholesky繼承該類,實作更多的計算功能:

這裡隻是介紹了具體行列式計算的實作,其實在Math.NET中這種實作隻要在調試的時候搞懂了其中一個,其他相關的都好懂了。調用的時候,由于矩陣的類型裡面都有相關的屬性,可以直接繼續計算,下面就示範一下如何調用計算行列式。

   在矩陣類Martix中,已經有一個屬性Determinant可以直接擷取矩陣的行列式,是以計算也非常簡單:

  輸出結果為:

  如果要使用特殊的分解算法類計算行列式,也可以單獨計算,例如下面的代碼,先利用matrix對象生成一個Cholesky分解算法的對象,然後用它來計算行列式:

結果如下:

繼續閱讀