La prima operazione che consideriamo è la trasposizione di una matrice quadrata; ricordiamo che trasporre una matrice quadrata corrisponde a ``ribaltarla'' lungo la diagonale principale:
// ex6_7_3 #include <iostream.h> const int N = 3; void stampa (double m[N][N]) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) cout << m[i][j] << "\t"; cout << "\n"; } } void scambia (double& a, double& b) { double t = a; a = b; b = t; } void trasponi (double m[N][N]) { for (int i = 0; i < N; i++) for (int j = i + 1; j < N; j++) scambia (m[i][j], m[j][i]); } void main() { double m[N][N]; for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) m[i][j] = j + i*N; stampa(m); trasponi(m); cout << "trasposta:\n"; stampa(m); }
output:
0 | 1 | 2 | |||
3 | 4 | 5 | |||
6 | 7 | 8 |
0 | 3 | 6 | |||
1 | 4 | 7 | |||
2 | 5 | 8 |
Vediamo ora un programma che somma due matrici, non necessariamente quadrate; si ricorda che la somma tra matrici è definita come segue:
// ex6_7_4 #include <iostream.h> #include <time.h> #include <stdlib.h> const int R = 3; // righe const int C = 4; // colonne void stampa (int m[R][C]) { for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) cout << m[i][j] << "\t"; cout << "\n"; } } // inserisce nella matrice numeri casuali tra -99 e 99 void riempi (int m[R][C]) { for (int i = 0; i < R; i++) for (int j = 0; j < C; j++) m[i][j] = 100 - rand() % 200; } // somma m1 a m2 e inserisce il risultato in m1 void somma (int m1[R][C], int m2[R][C]) { for (int i = 0; i < R; i++) for (int j = 0; j < C; j++) m1[i][j] += m2[i][j]; } void main() { // inizializza generatore numeri casuali srand ( time(0) ); int m1[R][C]; int m2[R][C]; riempi (m1); riempi (m2); stampa (m1); cout << "sommata a\n"; stampa (m2); cout << "uguale a\n"; somma (m1, m2); stampa (m1); }
esempio di output:
9 | 7 | 7 | 60 | ||
-73 | -13 | -57 | 96 | ||
56 | -86 | -20 | -31 |
-55 | -96 | -13 | -70 | ||
65 | -26 | -50 | 8 | ||
-1 | -59 | -57 | 49 |
-46 | -89 | -6 | -10 | ||
-8 | -39 | -107 | 104 | ||
55 | -145 | -77 | 18 |
Infine, vedremo nel prossimo esempio come effettuare il prodotto di una matrice per uno scalare; tale operazione è definita come segue:
// ex6_7_5 #include <iostream.h> const int R = 3; // righe const int C = 4; // colonne void ingresso (double m[R][C]) { for (int i = 0; i < R; i++) for (int j = 0; j < C; j++) { cout << "(" << i << " , " << j << ")? "; cin >> m[i][j]; } } void stampa (double m[R][C]) { for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) cout << m[i][j] << "\t"; cout << "\n"; } } void prodotto (double m[R][C], double alpha) { for (int i = 0; i < R; i++) for (int j = 0; j < C; j++) m[i][j] *= alpha; } void main() { double m[R][C]; ingresso (m); double alpha; cout << "scalare? "; cin >> alpha; stampa (m); cout << "moltiplicato " << alpha << ":\n"; prodotto (m, alpha); stampa (m); }
esempio di output:
(0 , 0)? 1
(0 , 1)? 2
(0 , 2)? 3
(0 , 3)? 4
(1 , 0)? 5
(1 , 1)? 6
(1 , 2)? 7
(1 , 3)? 8
(2 , 0)? 9
(2 , 1)? 10
(2 , 2)? 11
(2 , 3)? 12
scalare? 1.5
1 | 2 | 3 | 4 | |
5 | 6 | 7 | 8 | |
9 | 10 | 11 | 12 |
1.5 | 3 | 4.5 | 6 | |
7.5 | 9 | 10.5 | 12 | |
13.5 | 15 | 16.5 | 18 |