Гамарджоба! Сегодня мы будем говорить о рангах матрицы. Ранг матрицы - это наибольший из определителей ее миноров (отличных от нуля), который нужен для доказывания теорем и решения задач. Для человека вычислить ранг матрицы 1-5-го порядка ничего не стоит. Но найти ранг матрицы n-го порядка - дело компьютера :-) Алгоритм приблизительно такой:
1. Задать q равное 1
2. Посмотреть, если q<= минимальному из i и j тогда продолжить, если нет - перейти к пункту 6
3. Посмотреть все детерминанты матрицы q-го порядка. Если среди них есть отличные от нуля, то задать r = q
4. Добавить к q 1
5. Перейти к пункту 2
6. Записать результат
Вот блок-схема:
Рис. 1
Тут использована функция det_mat
из алгоритма о детерминанте. А вот С++ код:
int rang_mat(float* A[], int i, int j)
{
int r = 0;
int q = 1;
while(q<=l_min(i,j)) // проверка: порядок матрицы меньше или равен минимальному из размеров матрицы?
{ // если да
float **B = new float*[q]; // создаем новую матрицу размера q
for(int w=0;w<q;w++) B[w] = new float[q];
for(int a=0;a<(i-(q-1));a++) // тут начинается перебор матриц q-го порядка
{
for(int b=0;b<(j-(q-1));b++)
{
for(int c=0;c<q;c++)
{
for(int d=0;d<q;d++)
{
B[c][d] = A[a+c][b+d];
}
}
if(!(det_mat(B,q)==0)) // если определитель матрицы отличен от нуля
{ // то
r = q; // присваиваем рангу значение q
}
}
}
q++; // прибавляем 1
}
return r;
}
Функция l_min вот:
int l_min(int a, int b)
{
if(a>=b)return b;else return a;
}
Тут все понятно.
Вот и все! Кто заинтересовался, предлагаю скачать модуль с указанной функцией (тут для Linux, тут для Windows).