天天看點

【原創】開源Math.NET基礎數學類庫使用(16)C#計算矩陣秩1.什麼是矩陣秩2.Math.NET矩陣秩計算的實作3.Math.NET計算矩陣秩的代碼4.資源

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

  矩陣的秩是反映矩陣固有特性的一個重要概念。線上性代數中,一個矩陣a的列秩是a的線性無關的縱列的極大數目。類似地,行秩是a的線性無關的橫行的極大數目。矩陣的列秩和行秩總是相等的,是以它們可以簡單地稱作矩陣a的秩。通常表示為r(a),rk(a)或rank a。矩陣的行秩與列秩相等,是線性代數基本定理的重要組成部分. 其基本證明思路是,矩陣可以看作線性映射的變換矩陣,列秩為像空間的次元,行秩為非零原像空間的次元,是以列秩與行秩相等,即像空間的次元與非零原像空間的次元相等(這裡的非零原像空間是指約去了零空間後的商空間:原像空間)。這從矩陣的奇異值分解就可以看出來。矩陣秩的計算最容易的方式是高斯消去法,這裡引用維基百科的内容:

  計算矩陣a的秩的最容易的方式是高斯消去法,即利用矩陣的初等變換生成一個行階梯型矩陣,由于矩陣的初等變換不改變矩陣的秩,是以a的行梯陣形式有同a一樣的秩。經過初等變換的矩陣的非零行的數目就是原矩陣的秩。例如考慮4 × 4矩陣:
【原創】開源Math.NET基礎數學類庫使用(16)C#計算矩陣秩1.什麼是矩陣秩2.Math.NET矩陣秩計算的實作3.Math.NET計算矩陣秩的代碼4.資源
我們看到第2縱列是第1縱列的兩倍,而第4縱列等于第1和第3縱列的總和。第1和第3縱列是線性無關的,是以a的秩是2。這可以用高斯算法驗證。它生成下列a的行梯陣形式:
【原創】開源Math.NET基礎數學類庫使用(16)C#計算矩陣秩1.什麼是矩陣秩2.Math.NET矩陣秩計算的實作3.Math.NET計算矩陣秩的代碼4.資源
  它有兩個非零的橫行。在應用在計算機上的浮點數的時候,基本高斯消去(lu分解)可能是不穩定的,應當使用秩啟示(revealing)分解。一個有效的替代者是奇異值分解(svd),但還有更少代價的選擇,比如有支點(pivoting)的qr分解,它也比高斯消去在數值上更強壯。秩的數值判定要求對一個值比如來自svd的一個奇異值是否為零的依據,實際選擇依賴于矩陣和應用二者。 <a href="http://zh.wikipedia.org/wiki/%e7%a7%a9_(%e7%ba%bf%e6%80%a7%e4%bb%a3%e6%95%b0)" target="_blank">http://zh.wikipedia.org/wiki/秩_(線性代數)</a>

  矩陣秩線上性代數中的應用還是很廣的,如計算線性方程組的解的數目等,下面就看一下math.net中對該過程的計算實作以及如何調用的例子。

  math.net在對矩陣秩的計算過程中,和行列式的實作方式非常相似,也是把其作為矩陣計算的一個小部分功能,作為屬性添加在各個矩陣分解算法的抽象和實作類中,看一下其中一個svd分解算法抽象,由于計算簡單,已經直接實作了秩的計算,繼承類可以直接使用,就夠了,其他的使用下面也和行列式類似。

  上述過程和原理隻是便于大家了解其實作過程,下面簡單示範一下在math.net中計算矩陣秩的過程,就是直接調用計算即可。

結果如下:

繼續閱讀