> 文章列表 > C#,码海拾贝(16)——求“矩阵秩”的全选主元“高斯消去法(Gauss Elimination)”C#源代码,《C#数值计算算法编程》源代码升级改进版

C#,码海拾贝(16)——求“矩阵秩”的全选主元“高斯消去法(Gauss Elimination)”C#源代码,《C#数值计算算法编程》源代码升级改进版

C#,码海拾贝(16)——求“矩阵秩”的全选主元“高斯消去法(Gauss Elimination)”C#源代码,《C#数值计算算法编程》源代码升级改进版

1 矩阵的秩 Rank of Matrix

矩阵的秩是线性代数中的一个概念。在线性代数中,一个矩阵A的列秩是A的线性独立的纵列的极大数,通常表示为r(A),rk(A)或rank A。
在线性代数中,一个矩阵A的列秩是A的线性独立的纵列的极大数目。类似地,行秩是A的线性无关的横行的极大数目。即如果把矩阵看成一个个行向量或者列向量,秩就是这些行向量或者列向量的秩,也就是极大无关组中所含向量的个数。

2 相关定义 Rank of you

方阵(行数、列数相等的矩阵)的列秩和行秩总是相等的,因此它们可以简单地称作矩阵A的秩。通常表示为r(A),rk(A)或。
m × n矩阵的秩最大为m和n中的较小者,表示为 min(m,n)。有尽可能大的秩的矩阵被称为有满秩;类似的,否则矩阵是秩不足(或称为“欠秩”)的。
设A是一组向量,定义A的极大无关组中向量的个数为A的秩。
定义1. 在m*n矩阵A中,任意决定α行和β列交叉点上的元素构成A的一个k阶子矩阵,此子矩阵的行列式,称为A的一个k阶子式。
例如,在阶梯形矩阵中,选定1,3行和3,4列,它们交叉点上的元素所组成的2阶子矩阵的行列式 就是矩阵A的一个2阶子式。
定义2. A=(aij)m×n的不为零的子式的最大阶数称为矩阵A的秩,记作rA,或rankA或R(A)。
特别规定零矩阵的秩为零。
显然rA≤min(m,n) 易得:
若A中至少有一个r阶子式不等于零,且在r<min(m,n)时,A中所有的r+1阶子式全为零,则A的秩为r。
由定义直接可得n阶可逆矩阵的秩为n,通常又将可逆矩阵称为满秩矩阵, det(A)≠0;不满秩矩阵就是奇异矩阵,det(A)=0。
由行列式的性质知,矩阵A的转置AT的秩与A的秩是一样的,即rank(A)=rank(AT)。 [2] 
矩阵的秩
定理:矩阵的行秩,列秩,秩都相等。
定理:初等变换不改变矩阵的秩。
定理:如果A可逆,则r(AB)=r(B),r(BA)=r(B)。
定理:矩阵的乘积的秩Rab<=min{Ra,Rb};
引理:设矩阵A=(aij)sxn的列秩等于A的列数n,则A的列秩,秩都等于n。
当r(A)<=n-2时,最高阶非零子式的阶数<=n-2,任何n-1阶子式均为零,而伴随阵中的各元素就是n-1阶子式再加上个正负号,所以伴随阵为0矩阵。
当r(A)<=n-1时,最高阶非零子式的阶数<=n-1,所以n-1阶子式有可能不为零,所以伴随阵有可能非零(等号成立时伴随阵必为非零)。

3 高斯消元法 Gauss Elimination

要确定任意矩阵秩的大小,我们可以先用高斯消元法将矩阵变换为梯形矩阵。矩阵的秩数就是梯形矩阵中不为零的行数。这是因为行变换不会改变矩阵的秩。
证明:如果通过行变换可以把矩阵的某行变为零,那么就说明该行必定可以表示为其他行的线性组合;而梯形矩阵中每一个不为零的行都无法通过行变换变为零,所以他们都是线性无关的(具体证明留作习题)。证毕。
 

using System;namespace Zhou.CSharp.Algorithm
{/// <summary>/// 矩阵类/// 作者:周长发/// 改进:深度混淆/// https://blog.csdn.net/beijinghorn/// </summary>public partial class Matrix{/// <summary>/// 求矩阵秩的全选主元高斯消去法/// </summary>/// <param name="src">源矩阵</param>/// <returns>矩阵的秩</returns>public static int ComputeRankGauss(Matrix src){int i, j, k, nn, nis = 0, js = 0, z, zz, u, v;double q, d;// 秩小于等于行列数nn = src.Rows;if (src.Rows >= src.Columns){nn = src.Columns;}k = 0;// 消元求解for (z = 0; z <= nn - 1; z++){q = 0.0;for (i = z; i <= src.Rows - 1; i++){for (j = z; j <= src.Columns - 1; j++){zz = i * src.Columns + j;d = Math.Abs(src[zz]);if (d > q){q = d;nis = i;js = j;}}}if (Math.Abs(q) < float.Epsilon){return (k);}k = k + 1;if (nis != z){for (j = z; j <= src.Columns - 1; j++){u = z * src.Columns + j;v = nis * src.Columns + j;d = src[u];src[u] = src[v];src[v] = d;}}if (js != z){for (i = z; i <= src.Rows - 1; i++){u = i * src.Columns + js;v = i * src.Columns + z;d = src[u];src[u] = src[v];src[v] = d;}}zz = z * src.Columns + z;for (i = z + 1; i <= src.Columns - 1; i++){d = src[i * src.Columns + z] / src[zz];for (j = z + 1; j <= src.Columns - 1; j++){u = i * src.Columns + j;src[u] = src[u] - d * src[z * src.Columns + j];}}}return (k);}}
}

POWER BY 315SOFT.COM & TRUFFER.CN

4 矩阵秩的求解方法

矩阵秩的求法很多,一般归结起来有以下几种:

  • 通过对矩阵做初等变换(包括行变换以及列变换)化简为梯形矩阵求秩。此类求解一般适用于矩阵阶数不是很大的情况,可以精确确定矩阵的秩,而且求解快速比较容易掌握。
  • 通过矩阵的行列式,由于行列式的概念仅仅适用于方阵的概念。通过行列式是否为0则可以大致判断出矩阵是否是满秩。
  • 对矩阵做分块处理,如果矩阵阶数较大时将矩阵分块通过分块矩阵的性质来研究原矩阵的秩也是重要的研究方法。此类情况一般也是可以确定原矩阵秩的。
  • 对矩阵分解,此处区别与上面对矩阵分块。例如n阶方阵A,R分解(Q为正交阵,R为上三角阵)以及Jordan分解等。通过对矩阵分解,将矩阵化繁为简来求矩阵的秩也会有应用。
  • 对矩阵整体做初等变换(行变换为左乘初等矩阵,列变换为右乘初等矩阵)。此类情况多在证明秩的不等式过程有应用,技巧很高与前面提到的分块矩阵联系密切。

(本小节原文来自 https://blog.csdn.net/edward_zcl/article/details/90177159)