Diagonalele matricei
Într-o matrice pătratică (n x n), cele mai
importante elemente sunt cele de pe diagonale.
Ele împart matricea în zone cu proprietăți distincte.
Diagonala principală
Diagonala principală conține elementele unde linia
este egală cu coloana: a[i][i].
Matrice 4 x 4:
[*] . . . a[1][1]
. [*] . . a[2][2]
. . [*] . a[3][3]
. . . [*] a[4][4]
Afișarea diagonalei principale
for (int i = 1; i <= n; i++)
fout << a[i][i] << " ";Suma diagonalei principale
int suma = 0;
for (int i = 1; i <= n; i++)
suma = suma + a[i][i];Diagonala secundară
Diagonala secundară conține elementele unde
i + j == n + 1, adică
a[i][n + 1 - i].
Matrice 4 x 4:
. . . [*] a[1][4]
. . [*] . a[2][3]
. [*] . . a[3][2]
[*] . . . a[4][1]
Afișarea diagonalei secundare
for (int i = 1; i <= n; i++)
fout << a[i][n + 1 - i] << " ";Condiția generală
Un element a[i][j] este pe diagonala secundară
dacă i + j == n + 1.
Ambele diagonale
Matrice 5 x 5:
[*] . . . [*]
. [*] . [*] .
. . [*] . . ← centrul e pe ambele
. [*] . [*] .
[*] . . . [*]
Un element este pe cel puțin o diagonală
dacă i == j sau i + j == n + 1.
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (i == j || i + j == n + 1)
fout << a[i][j] << " ";Zonele matricei
Diagonalele împart matricea pătratică în 4 zone (triunghiuri):
Matrice 5 x 5:
\ N N N /
E \ N N / V
E E \ / V V
E E / \ V V
E / S S \ V
/ S S S \
- N (Nord / deasupra ambelor diagonale):
i < jșii < n + 1 - j→ simplu:i < j && i + j < n + 1 - S (Sud / sub ambele diagonale):
i > jșii > n + 1 - j→ simplu:i > j && i + j > n + 1 - V (Vest / stânga):
i > jșii + j < n + 1 - E (Est / dreapta):
i < j&&i + j > n + 1
Dar mai simplu, ne concentrăm pe cele mai frecvente:
Deasupra diagonalei principale
Elementele unde i < j (linia mai mică decât
coloana):
. * * *
. . * *
. . . *
. . . .
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++)
fout << a[i][j] << " ";Sub diagonala principală
Elementele unde i > j:
. . . .
* . . .
* * . .
* * * .
for (int i = 2; i <= n; i++)
for (int j = 1; j < i; j++)
fout << a[i][j] << " ";Deasupra diagonalei secundare
Elementele unde i + j < n + 1:
. * * .
* * . .
* . . .
. . . .
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (i + j < n + 1)
fout << a[i][j] << " ";Sub diagonala secundară
Elementele unde i + j > n + 1:
. . . .
. . . *
. . * *
. * * *
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (i + j > n + 1)
fout << a[i][j] << " ";Tabel rezumativ condiții
| Zonă | Condiție |
|---|---|
| Diagonala principală | i == j |
| Diagonala secundară | i + j == n + 1 |
| Deasupra diag. principale | i < j |
| Sub diag. principală | i > j |
| Deasupra diag. secundare | i + j < n + 1 |
| Sub diag. secundară | i + j > n + 1 |
Trucul: gândește-te la diagonala principală
ca la linia i = j pe un grafic. Deasupra ei =
i < j, sub ea = i > j. La
diagonala secundară, linia este i + j = n + 1.
Exemplu complet: suma pe zone
#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int a[101][101];
int n;
int main()
{
fin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
fin >> a[i][j];
int sumaDiagP = 0, sumaDiagS = 0;
int sumaDeasupra = 0, sumaSub = 0;
for (int i = 1; i <= n; i++) {
sumaDiagP = sumaDiagP + a[i][i];
sumaDiagS = sumaDiagS + a[i][n + 1 - i];
for (int j = 1; j <= n; j++) {
if (i < j) sumaDeasupra = sumaDeasupra + a[i][j];
if (i > j) sumaSub = sumaSub + a[i][j];
}
}
fout << "Diag principala: " << sumaDiagP << endl;
fout << "Diag secundara: " << sumaDiagS << endl;
fout << "Deasupra diag principale: " << sumaDeasupra << endl;
fout << "Sub diag principala: " << sumaSub << endl;
return 0;
}Greșeli frecvente
1. Confuzia între diagonala principală și secundară
- Principală:
i == j(stânga-sus spre dreapta-jos) - Secundară:
i + j == n + 1(dreapta-sus spre stânga-jos)
2. Formula greșită la diagonala secundară
a[i][n - i] // GREȘIT (indexare de la 1)
a[i][n + 1 - i] // CORECT (indexare de la 1)
a[i][n - 1 - i] // CORECT (indexare de la 0)3. Matricea nu e pătratică
Diagonalele au sens doar pe matrici
pătratice (n == m). Pe o matrice
dreptunghiulară, nu există diagonala principală în sens
clasic.
Ce să reții
- Diagonala principală:
i == j. - Diagonala secundară:
i + j == n + 1. - Deasupra/sub diagonala principală:
i < j/i > j. - Deasupra/sub diagonala secundară:
i + j < n + 1/i + j > n + 1. - Diagonalele împart matricea pătratică în 4 zone (triunghiuri).
- Funcționează doar pe matrici pătratice.