Sei sulla pagina 1di 25

Matrici

1
Array a più dimensioni
• Gli array a 1D realizzano i vettori, quelli a 2D
realizzano le matrici, …
• Dichiarazione:
int A[20][30];
A è una matrice di 20  30 elementi interi (600 variabili distinte)

float F[20][20][30];
F è una matrice 3D di 202030 variabili di tipo float (12.000!)

• Oppure a quattro dimensioni, ecc…

2
Excursus Matematico – Le Matrici
• In matematica, una matrice è uno schieramento
rettangolare di oggetti; le matrici di maggiore
interesse sono costituite da numeri appartenenti
ad un campo.
• Le matrici servono principalmente a descrivere
valori che dipendono da due parametri, e per
questo motivo sono ampiamente usate in
matematica e in tutte le scienze.
3 7 10 0
1 3 11 2
5 8 9 24

3
Excursus Matematico – Le Matrici
• Le righe orizzontali di una matrice sono chiamate righe,
mentre quelle verticali sono le colonne. Ad esempio, la
matrice mostrata sopra ha due righe e tre colonne. In
generale, una matrice è una matrice con m righe e n
colonne, dove m e n sono interi positivi fissati. Una
matrice generica è descritta solitamente indicando con aij
l'elemento posizionato alla riga i-esima e alla colonna j-
esima.
• I vettori possono essere considerati matrici molto
semplici, aventi una sola riga o una sola colonna. Più
precisamente, una matrice con una sola riga, di
dimensione , è detta vettore riga, mentre una matrice
con una sola colonna, di dimensione , è detta vettore
colonna.
4
Excursus Matematico – Le Matrici
• Qui sotto sono mostrati in ordine una matrice, un vettore
colonna ed un vettore riga

• Se la matrice si chiama A
– L'elemento posizionato nella riga i e nella colonna j può essere indicato
in vari modi: ad esempio come Ai,j, o tramite parentesi quadre A[i,j]. Si
usa talvolta la notazione A = (ai,j) per indicare che A è una matrice e che
i suoi elementi sono denotati con ai,j.
– Gli elementi con i due indici di riga e di colonna uguali, cioè gli elementi
della forma Ai,i costituiscono la diagonale principale della matrice.

5
Excursus Matematico – Le Matrici
Somma
• Due matrici A e B possono essere sommate se hanno le
stesse dimensioni.
• La loro somma A + B è definita come la matrice i cui
elementi sono ottenuti sommando i corrispettivi elementi
di A e B. Formalmente:
(A + B)i,j: = Ai,j + Bi,j
Per esempio
Excursus Matematico – Le Matrici
• La moltiplicazione per uno scalare è un'operazione
che, data una matrice A ed un numero c (detto scalare),
costruisce una nuova matrice cA, il cui elemento è
ottenuto moltiplicando l'elemento corrispondente di A per
c
(cA)ij: = cAi,j. Per esempio:
Excursus Matematico – Le Matrici
Prodotto riga per colonna
• La moltiplicazione tra due matrici A e B è un'operazione
più complicata delle precedenti. A differenza della
somma, non è definita sommando semplicemente gli
elementi aventi lo stesso posto
– La definizione di moltiplicazione che segue è motivata dal fatto
che una matrice modellizza una applicazione lineare, e in questo
modo il prodotto di matrici corrisponde alla composizione di
applicazioni lineari
• La moltiplicazione è definita soltanto se il numero di
righe di B coincide con il numero n di colonne di A. Il
risultato è una matrice con lo stesso numero di righe di A
e lo stesso numero di colonne di B
• L’elemento di posizione (i,j) è dato dalla somma
Excursus Matematico – Le Matrici
Excursus Matematico – Le Matrici
Matrici quadrate
• Una matrice si dice quadrata se ha lo stesso numero di
righe e colonne.
• Una matrice quadrata ha una diagonale principale,
quella formata da tutti gli elementi ai,i con indici uguali. La
somma di questi elementi è chiamata traccia.
L'operazione di trasposizione trasforma una matrice
quadrata A nella matrice At ottenuta scambiando ogni ai,j
con aj,i, in altre parole ribaltando la matrice intorno alla
sua diagonale principale.
• Una matrice tale che ai,j = aj,i è una matrice simmetrica.
In altre parole, A è simmetrica se A = At. Se tutti gli
elementi che non stanno nella diagonale principale sono
nulli, la matrice è detta diagonale.
#include <stdio.h>
#define DIM 4
int main() {
int i,j,M[DIM][DIM];

for(i=0;i<DIM;i++){ Riempire
for(j=0;j<DIM;j++){
printf("Dammi elemento (%d,%d)\n",i,j); e visualizzare
}
scanf("%d",&M[i][j]);
una matrice
}

for(i=0;i<DIM;i++){
for(j=0;j<DIM;j++){
printf("%4d",M[i][j]);
}
printf("\n");
}

return 0;
}

11
Memorizzazione di un array 2D
Cioè la rappresentazione in memoria di un
array a 2 dimensioni:
– array memorizzato riga per riga, per indice di
riga crescente, e, all’interno di ogni riga, per
indice di colonna crescente
int matrice[2][3];

matrice[0][0] matrice[0][1] matrice[0][2]


matrice[1][0] matrice[1][1] matrice[1][2]
Memorizzazione di un array 2D
Cioè la rappresentazione in memoria di un
array a 2 dimensioni:
– array memorizzato riga per riga, per indice di
riga crescente, e, all’interno di ogni riga, per
indice di colonna crescente
int matrice[2][3]; Indirizzi crescenti
in memoria
val. matrice[0][0] centrale
matrice[0] val. matrice[0][1]
val. matrice[0][2]
val. matrice[1][0]
matrice[1] val. matrice[1][1]
val. matrice[1][2]
Memorizzazione di un array 3D
Definire un tipo di dato atto a contenere i numeri estratti
nelle ultime 10 giocate su tutte le 11 ruote (vengono estratti
5 numeri per giocata)
int Lotto[11][5][10]; Storico
val. Lotto[0][0][0]

Ruota Giocata val. Lotto[0][0][5]


Lotto[0][0]

Lotto[0] Lotto[0][1]

Lotto[0][5]

Lotto[1][0]
Lotto[1] Lotto[1][1]

/* Frammento di programma per verificare se una matrice è simmetrica */

int MatQuadra[N][N], j, i=0;


int sim = 1; /* sim inizialmente vale 1 */
/* ... inserimento dati nella matrice ... codice omesso ... */
while ( i < N ) {
j = 0;
while ( j < N ) {
if ( MatQuadra[i][j] != MatQuadra[j][i] )
sim = 0; /*Alla fine sim varrà 0 se e solo se non è simmetrica*/
++j;
}
++i; è corretto?
} si può migliorare?

15
È corretto, ma…
• Confronta MatQuadra[i][j] con
MatQuadra[j][i] e, poi, anche MatQuadra[j]
[i] con MatQuadra[i][j]
• Confronta MatQuadra[i][i] con se stesso
• Se trova una dissimmetria, continua con la
verifica, ma è inutile

• Esercizio: se ne scriva una versione


“ottimizzata” che risolva i tre problemi

16
int MatQuadra[N] [N], j, i=0;
int sim = 1; /* sim inizialmente vale 1 */
/* ... inserimento dati nella matrice ... codice omesso ... */
while ( i < NN )&&{ sim ) {
j = 0;
while ( j <=< iN&&)&&
i &&{ sim
sim
sim) )) {{
if ( MatQuadra[i] [j] != MatQuadra[j] [i] )
sim = 0; /*Alla fine sim varrà 0 se e solo se non è simmetrica*/
++j;
}
++i;
} ORA È OK

17
Esempio
• Scrivere un programma che riempia una
matrice 20x30 chiedendo all’utente di
inserire gli elementi, ma inserendo nella
matrice solo gli elementi pari.
• Il programma termina quando la matrice è
piena.

18
#define N 20
#define M 30

int main () {
int i=0,j=0,n,mat[N][M];

while(i<N) {
j=0;
while(j<M) {
scanf("%d",&n);

if(n%2==0) {
mat[i][j]=n;
j++; //solo se soddisfa il vincolo
}
}
i++;
}
return 0;
}

19
#define N 20
#define M 30

int main () {
int i=0,j=0,n,mat[N][M];

for(i=0; i<N; i++){


for(j=0; j<M; j++){
scanf("%d",&n);

if(n%2==0)
mat[i][j]=n;
else
j--; // annulliamo l’incremento di j
}
}
return 0;
} 20
Esempio (tde 14-11-2008)
• Scrivere un programma che chiede
all’utente di inserire una matrice NxN con
elementi tutti diversi. Se l’utente inserisce
un numero già inserito il programma lo
avvisa dell’errore e chiede nuovamente di
inserire l’elemento.

21
Un suggerimento
• Si consideri come viene riempita la
matrice. Tipicamente l’inserimento avviene
per righe, quindi occorre controllare
interamente le righe precedenti e la riga
corrente fino alla colonna specificata.
#include <stdio.h>
#define N 10
int main(){
int i,j,k,t,cont,A[N][N],howMany=0,ok=1;
for (i=0;i<N;i++) {
for (j=0;j<N;j++) {
do {
cont=0;
ok=1;
printf(“Inserire un valore\n”);
scanf(“%d”, &A[i][j]);
for (k=0;k<N && cont < howMany;k++) {
for (t=0;t<N && cont < howMany;t++) {
if (A[i][j] == A[k][t]) { ok=0;
printf(“Errore:valore duplicato\n”);
}
cont++;
}
}
} while (ok==0);
howMany++;
}
}
} 23
#include <stdio.h>
Somma di matrici #define N 3
#define M 4
int main() {
int a[N][M], b[N][M], c[N][M];
c[i][j] = a[i][j] + b[i][j] int i, j;
//leggo la prima matrice
0 1 2 3 for (i=0; i<N; i++)
0 3 7 10 0
for (j=0; j<M; j++)
scanf(“%d”, &a[i][j]);
1 1 3 11 2
//leggo la seconda matrice
2 5 8 9 24 for (i=0; i<N; i++)
+ for (j=0; j<M; j++)
2 1 0 5
scanf(“%d”, &b[i][j]);
0
//calcolo e stampo la somma
7 9 6 2
1 for (i=0; i<N; i++){
2 5 1 2 4 for (j=0; j<M; j++){
c[i][j]=a[i][j]+b[i][j];
=
printf(“%d\t“, c[i][j]);
0 5 8 10 5 }
1 8 12 17 4 printf(“\n”);
2 10 9 11 28 }
return 0;
Prodotto di matrici
0 1 2 3 4
0 1 2 3
2 1 0 4 3
0 3 7 10 0 0
1 1 3 11 2
7 9 6 1 2
1 c[1][2] =∑(a[1][k]*b[k][2]),
*
5 8 9 24 5 1 2 5 0 con k = 0, ..., 3
2 2
11 0 3 8 7
3

0 1 2 3 4
0
#define N 3 18+
#define M 4 1 22+6
#define L 5 2
.....
for (i=0; i<N; i++){
for (j=0; j<L; j++){
c[i][j] = 0;
for (k=0; k<M; k++)
c[i][j] = c[i][j]+(a[i][k]*b[k][j]);
printf(“%d\t”, c[i][j]);/*\t è il tab*/
}
printf(“\n”);
}