Il rango di una matrice è una proprietà che risulta fondamentale in quanto dà il numero di righe o colonne linearmente indipendenti della matrice stessa.
Il rango è nullo solo per la matrice nulla ed ha la proprietà di essere un numero naturale compreso fra 0 ed il minimo fra il numero di righe e colonne:
Dove n ed m sono rispettivamente il numero di righe ed il numero di colonne.
Come faccio a calcolare facilmente il rango di una matrice?
Ci viene in aiuto il metodo di eliminazione gaussiana visto nel calcolo dell'inversa di una matrice, il ragno della matrice risulta nient’altro che il numero di pivot!
Riporto un brevissimo esempio di utilizzo della classe da me creata per il calcolo del rango.
//Declare matrices
Matrix A("[ 1, 0, 3, 0, 5 ; 2, 4, 0, 4, 6 ; 1, 0, 4, 0, 6 ; 1, 0, 2, 4, 3 ; 5, 4, 4, 1, 1 ]");
Matrix B("[ 1, 1, 3 ; 1, 0, 1 ; 1, 0, 1 ; 1, 0, 1]");
//Print matrix A
std::cout << "A:\n";
print(A);
std::cout << "\n";
//Calc and print rank A
double rkA = A.rank();
printf("rank(A) = %.3f\n\n",rkA);
//Print matrix B
std::cout << "B:\n";
print(B);
std::cout << "\n";
//Calc and print rank B
double rkB = B.rank();
printf("rank(B) = %.3f\n\n",rkB);
L'ouput sarà il seguente, sono riportate anche le matrici intermedie calcolate con l'eliminazione gaussiana:
A:
1.000 0.000 3.000 0.000 5.000
2.000 4.000 0.000 4.000 6.000
1.000 0.000 4.000 0.000 6.000
1.000 0.000 2.000 4.000 3.000
5.000 4.000 4.000 1.000 1.000
1.000 0.000 3.000 0.000 5.000
0.000 4.000 -6.000 4.000 -4.000
0.000 0.000 1.000 0.000 1.000
0.000 0.000 0.000 4.000 -1.000
0.000 0.000 0.000 0.000 -15.750
rank(A) = 5.000
B:
1.000 1.000 3.000
1.000 0.000 1.000
1.000 0.000 1.000
1.000 0.000 1.000
1.000 1.000 3.000
0.000 -1.000 -2.000
0.000 0.000 0.000
0.000 0.000 0.000
rank(B) = 2.000