Перейти до основного вмісту

Знаходження рангу матриці

Ранг матриці — це найбільша кількість лінійно незалежних рядків/стовпців матриці. Ранг визначено не лише для квадратних матриць.

Ранг матриці можна також означити як найбільший порядок будь-якого ненульового мінора матриці.

Нехай матриця прямокутна і має розмір N×MN \times M. Зауважимо, що якщо матриця квадратна і її визначник ненульовий, то ранг дорівнює NN (=M=M); інакше він буде меншим. Загалом ранг матриці не перевищує min(N,M)\min (N, M).

Коли підходить цей алгоритм?
  • Потрібна кількість лінійно незалежних рядків/стовпців (ранг) прямокутної або квадратної матриці?
  • Замість рангу потрібно розв'язати систему Ax=bAx=b чи з'ясувати кількість її розв'язків? (якщо так → Метод Гаусса для СЛАР)
  • Матриця квадратна і вас цікавить лише чи вона вироджена (визначник нульовий)? (якщо так → Визначник методом Гаусса)

Алгоритм

Шукати ранг можна за допомогою методу Гаусса. Ми виконуватимемо ті самі операції, що й при розв'язуванні системи чи знаходженні її визначника. Але якщо на якомусь кроці в ii-му стовпці серед рядків, які ми ще не вибрали, немає жодного з ненульовим елементом, то ми пропускаємо цей крок. Інакше, якщо на ii-му кроці ми знайшли рядок з ненульовим елементом у ii-му стовпці, то ми позначаємо цей рядок як вибраний, збільшуємо ранг на одиницю (спочатку ранг встановлено рівним 00) і виконуємо звичайні операції віднімання цього рядка від решти.

Складність

Цей алгоритм працює за O(n3)\mathcal{O}(n^3).

Реалізація

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;
}

Задачі

Відеоматеріали