開源Math.NET基礎數學類庫使用(16)C#計算矩陣秩

來源:互聯網
上載者:User

標籤:

原文:【原創】開源Math.NET基礎數學類庫使用(16)C#計算矩陣秩

               本部落格所有文章分類的總目錄: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/4304304.html

1.什麼是矩陣秩

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

  計算矩陣A的秩的最容易的方式是高斯消去法,即利用矩陣的初等變換產生一個行階梯型矩陣,由於矩陣的初等變換不改變矩陣的秩,因此A的行梯陣形式有同A一樣的秩。經過初等變換的矩陣的非零行的數目就是原矩陣的秩。例如考慮4 × 4矩陣:

我們看到第2縱列是第1縱列的兩倍,而第4縱列等於第1和第3縱列的總和。第1和第3縱列是線性無關的,所以A的秩是2。這可以用高斯演算法驗證。它產生下列A的行梯陣形式:

  它有兩個非零的橫行。在應用在電腦上的浮點數的時候,基本高斯消去(LU分解)可能是不穩定的,應當使用秩啟示(revealing)分解。一個有效替代者是奇異值分解(SVD),但還有更少代價的選擇,比如有支點(pivoting)的QR分解,它也比高斯消去在數值上更強壯。秩的數值判定要求對一個值比如來自SVD的一個奇異值是否為零的依據,實際選擇依賴於矩陣和應用二者。

http://zh.wikipedia.org/wiki/秩_(線性代數)

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

2.Math.NET矩陣秩計算的實現

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

 1 internal abstract class Svd : Svd<float> 2 { 3     protected Svd(Vector<float> s, Matrix<float> u, Matrix<float> vt, bool vectorsComputed) 4         : base(s, u, vt, vectorsComputed) { } 5  6     /// <summary>計算矩陣秩</summary> 7     /// <value>The number of non-negligible singular values.</value> 8     public override int Rank 9     {10         get11         {12             return S.Count(t => !Math.Abs(t).AlmostEqual(0.0f));13         }14     }15     public override double L2Norm16     {17         get{return Math.Abs(S[0]);}18     }19 20     public override float ConditionNumber21     {22         get23         {24             var tmp = Math.Min(U.RowCount, VT.ColumnCount) - 1;25             return Math.Abs(S[0]) / Math.Abs(S[tmp]);26         }27     }28     /// <summary>計算行列式 </summary>29     public override float Determinant30     {31         get32         {33             if (U.RowCount != VT.ColumnCount)34             {35                 throw new ArgumentException(Resources.ArgumentMatrixSquare);36             }37 38             var det = 1.0;39             foreach (var value in S)40             {41                 det *= value;42                 if (Math.Abs(value).AlmostEqual(0.0f))43                 {44                     return 0;45                 }46             }47             return Convert.ToSingle(Math.Abs(det));48         }49     }50 }
3.Math.NET計算矩陣秩的代碼

  上述過程和原理只是便於大家理解其實現過程,下面簡單示範一下在Math.NET中計算矩陣秩的過程,就是直接調用計算即可。

 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 < matrix.RowCount; i++) 9 {10     for (var j = 0; j < matrix.ColumnCount; j++)11     {12         matrix[i, j] = rnd.NextDouble();13     }14 }15 16 Console.WriteLine(@"Initial matrix");17 Console.WriteLine(matrix.ToString("#0.00\t", formatProvider));18 Console.WriteLine();19 //1. 秩20 Console.WriteLine(@"矩陣秩計算結果為:");21 Console.WriteLine(matrix.Rank());22 Console.WriteLine();

結果如下:

 1 Initial matrix 2 DenseMatrix 5x5-Double 3 0.25      0.11    0.47    0.77    0.66 4 0.43      0.35    0.94    0.10    0.64 5 0.03      0.25    0.32    0.99    0.68 6 0.65      0.28    0.62    0.70    0.70 7 0.95      0.09    0.16    0.38    0.80 8  9 10 矩陣秩計算結果為:11 5
4.資源

  包括原始碼以及案例都可以去官網下載,本系列文章的目錄中第一篇文章:http://www.cnblogs.com/asxinyu/p/4264638.html,有介紹。由於源碼很大,如果找不到相應的案例,可以進行搜尋,可以比較快的找到相應的代碼。

開源Math.NET基礎數學類庫使用(16)C#計算矩陣秩

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.