next up previous contents index
Next: Operazioni avanzate su matrici Up: Matrici Previous: Matrici   Indice   Indice analitico

Operazioni base sulle matrici

In questo sottoparagrafo e nel successivo, la nostra attenzione sarà focalizzata sulle operazioni da compiere sulle matrici, piuttosto che sulla flessibilità delle funzioni utilizzate; considereremo infatti le dimensioni delle matrici sempre fisse. Lo studente è tuttavia invitato, a partire dal prossimo capitolo (nel quale verrà introdotto un metodo per utilizzare la memoria dinamica) a considerare nuovamente gli esempi presentati in questa sede, cercando di modificarli in maniera tale da poterli utilizzare con matrici a dimensione variabile.

La prima operazione che consideriamo è la trasposizione di una matrice quadrata; ricordiamo che trasporre una matrice quadrata corrisponde a ``ribaltarla'' lungo la diagonale principale:

\begin{displaymath}
\left( \begin{array}{llll}
a_{11} & a_{12} & \ldots & a_{1n}...
...dots \\
a_{1n} & a_{2n} & \ldots & a_{nn}
\end{array} \right)
\end{displaymath}


// 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    

trasposta:
 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:

\begin{eqnarray*}
& \left( \begin{array}{llll}
a_{11} & a_{12} & \ldots & a_{1n}...
...& a_{n2} + b_{n2} & \ldots & a_{nn} + b_{nn}
\end{array} \right)
\end{eqnarray*}




// 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  

sommata a
 -55 -96 -13 -70  
 65 -26 -50 8  
 -1 -59 -57 49  

uguale a
 -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:

\begin{displaymath}
\alpha \cdot
\left( \begin{array}{llll}
a_{11} & a_{12} & \...
...cdot a_{n2} & \ldots & \alpha \cdot a_{nn}
\end{array} \right)
\end{displaymath}


// 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

moltiplicato 1.5:
 1.5 3 4.5 6
 7.5 9 10.5 12
 13.5 15 16.5 18


next up previous contents index
Next: Operazioni avanzate su matrici Up: Matrici Previous: Matrici   Indice   Indice analitico
Claudio Cicconetti
2000-09-06