求矩阵的秩(Finding the rank of a matrix)
矩阵的秩是矩阵的最大线性独立行/列数。
矩阵的秩也可以定义为矩阵中任何非零次要的最大阶。
让矩阵为非方阵,大小为 N × M N×M N×M 。请注意,如果矩阵是方阵,并且它的行列式是非零的,那么它的秩是 N ( = M ) N(=M) N(=M) ;否则它的秩会更小。一般来说,矩阵的秩不会超过 min ( N , M ) \min(N, M) min(N,M) 。
算法
你可以用高斯消除法来求秩。我们将执行与求解系统或寻找其行列式时相同的操作。但是如果在第 i i i 列的任何一步,在我们没有选择的那些行中没有非空的条目,那么我们就跳过这一步。否则,如果我们在第 i i i 步中发现第 i i i 列中有一个非零元素的行,那么我们就把这一行标记为被选中的行,秩加 1 1 1 (最初的秩被设置为 0 0 0 ),并执行通常的操作,把这一行从其他行中取出。
复杂度
O ( n 3 ) \mathcal{O}(n^3) O(n3)
实现
const double EPS = 1E-9;
int compute_rank(vector<vector<double>> A) {
int n = A.size();
int m = A[0].size();
int rank = 0;
vector<bool> row_selected(n, false);
for (int i = 0; i < m; ++i) {
int j;
for (j = 0; j < n; ++j) {
if (!row_selected[j] && abs(A[j][i]) > EPS)
break;
}
if (j != n) {
++rank;
row_selected[j] = true;
for (int p = i + 1; p < m; ++p)
A[j][p] /= A[j][i];
for (int k = 0; k < n; ++k) {
if (k != j && abs(A[k][i]) > EPS) {
for (int p = i + 1; p < m; ++p)
A[k][p] -= A[j][p] * A[k][i];
}
}
}
}
return rank;
}