Introduzione a Matlab: matrici e cicli for/while
Emma Perracchione
Corso di Calcolo Numerico per Ingegneria Meccanica (Univ. PD) Queste slides sono principalmente fornite dal Prof. Alvise Sommariva; vedasi https://www.math.unipd.it/~alvise/DIDATTICA/didattica_CNIE1819.html
A.A. 2018/2019
Materiale
Materiale
TUTTO IL MATERIALE SI TROVA AL SEGUENTE LINK E VERRA' AGGIORNATO AD OGNI LEZIONE.
https://www.math.unipd.it/~emma/CN1819.html OPUURE VEDASI
https://elearning.unipd.it/dii/course/view.php?id=1720
Matrices in Matlab
Denire matrici
Esistono vari modi per denire una matriceA. Se ad esempio dovessimo denire:
A =
1 2 3 4 5 6 7 8 9
, il modo più comune è via l'assegnazione diretta
A=[1 2 3; 4 5 6; 7 8 9]; .
Con il comando A(i,j)è possibileselezionare la componente (i, j) della matrice A.
Inoltre
con il comando A(:,j) si seleziona la j-sima colonna di A, con il comando A(i,:) si seleziona la i-sima riga di A.
Matrices in Matlab
Prime prove con le matrici
1 >> A=[1 2 3; 4 5 6; 7 8 9]
2 A =
3 1 2 3
4 4 5 6
5 7 8 9
6 >> A(2,3) % terzo elemento della seconda riga.
7 ans =
8 6
9 >> A(:,3) % terza colonna.
10 ans =
11 3
12 6
13 9
14 >> A(2,:) % seconda riga.
15 ans =
16 4 5 6
Matrices in Matlab
Operazioni con le matrici Supponiamo
A = (ai ,j)i ∈[1,m],j∈[1,n], B = (bi ,j)i ∈[1,m],j∈[1,n], siano matrici della stessa dimensione m × n ed s uno scalare.
c=s*A assegna a c il prodotto dello scalare s con la matrice A, ovvero c = (ci ,j)i ∈[1,m],j∈[1,n] con
ci ,j = s · ai ,j, i =1, . . . , m, j = 1, . . . , n;
c=A'assegna a c la trasposizione della matrice A, ovvero c = (ci ,j)i ∈[1,n],j∈[1,m] con
ci ,j = aj ,i, i =1, . . . , n, j = 1, . . . , m;
c=A+B assegna a c la somma della matrice A col la matrice B, ovvero c = (ci ,j)i ∈[1,m],j∈[1,n] con
ci ,j = ai ,j+ bi ,j, i =1, . . . , m, j = 1, . . . , n.
Matrices in Matlab
Operazioni matrici in Matlab
>> A=[1 2; 3 4] % matrice A A =
1 2
3 4
>> B=[7 8; 9 10] % matrice B B =
7 8
9 10
>> A+B % matrice A+B ans =
8 10
12 14
>> A-B % matrice A-B ans =
-6 -6
-6 -6
Matrices in Matlab
Prodotti tra matrici in Matlab
c=A.*B assegna a c il prodottopuntualedella matrice A col la matrice B, ovvero c = (ci ,j)i ∈[1,m],j∈[1,n] con
ci ,j = ai ,j· bi ,j, i =1, . . . , m, j = 1, . . . , n;
c=A./B assegna a c la divisionepuntuale della matrice A col la matrice B, ovvero c = (ci ,j)i ∈[1,m],j∈[1,n] con
ci ,j = ai ,j
bi ,j, i =1, . . . , m, j = 1, . . . , n;
c=A.ˆk assegna a c la potenza k-sima puntualedella matrice A, ovvero c = (ci ,j)i ∈[1,m],j∈[1,n] con
ci ,j = aki ,j, i =1, . . . , m, j = 1, . . . , n.
Matrices in Matlab
Prodotti tra matrici in Matlab
1 >> A.*B % matrice A per B (comp. per comp.)
2 ans =
3 7 16
4 27 40
5 >> A./B % matrice A diviso B (comp. per comp.)
6 ans =
7 0.1429 0.2500
8 0.3333 0.4000
9 >> A.^2 % matrice A al quadrato (comp. per comp.)
10 ans =
11 1 4
12 9 16
13 >>
14
Matrices in Matlab
Prodotti tra matrici
Osserviamo che quello citatonon corrisponde all'usuale prodotto di matrici. Infatti, se
1 Aha m righe ed n colonne,
2 B ha n righe ed p colonne, allora
C = A ∗ B,
è una matrice con m righe e p colonne tale che C = (ci ,j) con
ci ,j =
n
X
k=1
ai ,k· bk,j, i =1, . . . , m, j = 1, . . . , p.
Matrices in Matlab
Prodotti tra matrici in Matlab
1 >> A=[1 2; 3 4]
2 A =
3 1 2
4 3 4
5 >> B=[7 8; 9 10]
6 B =
7 7 8
8 9 10
9 >> A*B % prodotto tra matrici
10 ans =
11 25 28
12 57 64
13 >> A.*B % prodotto puntuale tra matrici
14 ans =
15 7 16
16 27 40
Matrices in Matlab
Comandi utili per matrici
rand(m,n) matrice di numeri random di ordine m per n det(A) determinante della matrice A
size(A) numero di righe e colonne di A hilb(n) matrice di Hilbert di ordine n eye(n) matrice identica di ordine n zeros(n) matrice nulla di ordine n
ones(n) matrice con componenti 1 di ordine n diag(A) vettore diagonale della matrice A inv(A) inversa di A
norm(A) norma di A (anche vettori!) cond(A) condizionamento di A eig(A) autovalori di A
Matrices in Matlab
Comandi utili per matrici in Matlab
1 >> A =[ 1,2; 3,4];
2 >> size(A)
3 ans =
4 2 2
5 >> eye(2) % matrice identica di dimensione 2.
6 ans =
7 1 0
8 0 1
9 >> zeros(2) % matrice zero di dimensione 2.
10 ans =
11 0 0
12 0 0
13 >> diag(A) % vettore contenente A(1,1), A(2,2).
14 ans =
15 1
16 4
Matrices in Matlab
Comandi utili per matrici in Matlab
1 >> % AGGIUNGERE RIGHE AD UNA MATRICE.
2 >> A=[1 2 3; 4 5 6; 7 8 9]
3 A =
4 1 2 3
5 4 5 6
6 7 8 9
7 >> B=[10 11 12; 13 14 15];
8 >> C=[A; B]
9 C =
10 1 2 3
11 4 5 6
12 7 8 9
13 10 11 12
14 13 14 15
15 >>
16
Matrices in Matlab
Comandi utili per matrici in Matlab
1 >> % AGGIUNGERE COLONNE AD UNA MATRICE.
2 >> A=[1 2 3; 4 5 6; 7 8 9]
3 A =
4 1 2 3
5 4 5 6
6 7 8 9
7 >> B=[3.5; 4.5; 5.5];
8 >> C=[A B]
9 C =
10 1.0000 2.0000 3.0000 3.5000
11 4.0000 5.0000 6.0000 4.5000
12 7.0000 8.0000 9.0000 5.5000
1314
L'editor di Matlab
Come accedervi
Talvolta scivere una successione di istruzioni sulla command window risulta essere complicato.
Matlab ore un ambiente di testo dove poter (con più calma) scrivere le istruzioni. Esso è detto Editor e per eccedervi è necessario cliccare su New Script.
L'editor di Matlab
Come si presenta
Si presenta come un le vuoto (detto script e/o function).
ATTENZIONE ALLA LORO DIFFERENZA, spiegata nelle prossime slides.
Scriviamo dei comandi elementari:
1 % somma di due numeri
2 a=1; b=5;
3 a+b
4
e salviamo lo script come Prova1.m NELLA PRESENTE DIRECTORY.
L'editor di Matlab
File tipo script
Il le di testo Prova1.m è un le di tipo script. Infatto esso può essere esguito dalla command window con una riga di testo. Digitare
1 >> Prova1
2
Ciò che distingue uno script da una Matlab function è proprio la parola chiavefunctionche NON è presente nello script.
Le function possono essere richiamate da uno script o dalla command window (MA NECESSITANO DI PARAMETRI DI INPUT).
Per capirci sono come le function viste in precedenza (exp, cos, ....), ma sono denite dall'utente.
L'editor di Matlab
File tipo function
Come prima clicchiamo sull'icona per aprire un nuovo le di testo vuoto nel Matlab editor.
Scriviamo la funzione che preso x numero reale come INPUT ritorna un altro numero reale y denito come y = 5 + sin(x).
1 % per scrivere una function il comando chiave
2 % e' il seguente:
3 % function [OUTPUT1,OUTPUT2,...]
4 % = nomefunzione(INPUT1,INPUT2,...)
5 function [y] = funprova(x)
6 y = 5+sin(x);
7
Salviamoil le nella cartella corrente come funprova. Salvarlo con lo STESSO NOME che compare nella function.
L'editor di Matlab
Richiamare le function nella command window
Abbiamo ora due modi per utilizzare tale function. Suponiamo di voler calcolare la funzione 5 + sin(x) in x = 5.
Primo modo: Andiamo sulla command window e digitiamo 1 >> y = funprova(5);
2
Vedrete che nello spazio dedicato alle variabili ècomparsa la variabile y con il valore desiderato.
NB: Le function vanno SEMPRE richiamate con dei parametri di input messi tra parentesi tonde. In questo caso il parametro è 5.
L'editor di Matlab
Richiamare le function da uno script
Secondo modo per richiamre le function: aprite un NUOVO script e digitate
1 z = funprova(5);
2
Salvate tale le come prova2. Digitate nella command window
1 >> prova2
2
Ora nell'ambiente delle variabili è comparsa la variabile z (che ha lo stesso valore di y).
Se nello script avessimo scitto
1 y = funprova(5);
2
la variabile y sarebbe stata sovrascritta.
L'editor di Matlab
L'help per le function
Spesso nell'help di Matlab le funzioni sono in maiuscolo, ma quando devono essere chiamate si usi il minuscolo. Per esempio,
1 >>help sum
2 SUM(X,DIM) sums along the dimension DIM.
3 >> a=[1 2];
4 >> SUM(a);
5 ??? Capitalized internal function SUM; Caps Lock may be on.
6 >> sum(a)
7 ans =
8 3
9 >>
10
Conseguentemente il comando (vettoriale) sum che somma tutte le componenti di un vettore non può essere scritto in maiuscolo.
Linguaggio di Matlab
Operatori di relazione e logici
I principali operatori di relazione sono
== uguale v = non uguale
< minore
> maggiore
<= minore uguale
>= maggiore uguale I principali operatori logicisono
&& and
|| or
v not
& and (componente per componente)
| or (componente per componente)
Linguaggio di Matlab
Operatori di relazione e logici: Esempi
1 >> (3 == 3) & (2+2 >= 4) % (SI & SI)=SI
2 ans =
3 logical
4 1
5 >> ( 3 == 3 ) & ( pi == 3 ) % (SI & NO)=NO
6 ans =
7 logical
8 0
9 >> (3 == 4) | (2+2 >= 4) % (NO o SI)=SI
10 ans =
11 logical
12 1
13 >> (3 == 4) | ~(2+2 == 4) % (NO o non SI)=(NO o NO)= NO
14 ans =
15 logical
16 0
Linguaggio di Matlab
Le istruzioni condizionali
L'istruzione condizionale semplice esegue sequenzialmente alcune operazioni, se certi test vengono soddisfatti, secondo
if (espressione logica)
<processo 1 >
else
<processo 2 >
end
Il ramo else talvolta non è necessarioe possiamo quindi scrivere un'istruzione del tipo
if (espressione logica)
< processo 1 >
end
Linguaggio di Matlab
Le istruzioni condizionali: Esempi Vediamo un esempio.
1 >> a = 50;
2 >> if a > 0
3 s=1;
4 else
5 if a < 0
6 s=_1;
7 else
8 s=0;
9 end
10 end
11 >> fprintf('a: %5.5f s: %1.0f',a,s);
12
E' facile vedere che questo codice calcola il segno di a, nel nostro caso a =50.
Linguaggio di Matlab
Le istruzioni condizionali
Lastruttura condizionale multipla, sfrutta il fatto che nella struttura condizionale alternativa, si possano utilizzare nuovamente istruzioni condizionali (semplici o multiple), come ad esempio
if < espressione logica 1 e' vericata >
<processo 1 >
elseif < espressione logica 2 e' vericata >
<processo 2 >
else
<processo 3 >
end end
Linguaggio di Matlab
Comandi nd e rand
Il comando find determina le occorrenze di uno o più elementi in un vettore.
Il comando rand determina numeri casuali in [0, 1].
>> a a =
5 3 6
>> find(a == 6) ans =
3
>> % Il valore di "a" che vale "6" e' il terzo.
>> rand(1,3) % vettore 1 x 3 di numeri casuali, ans =
0.8235 0.6948 0.3171
>> rand(2,2) % matrice 2 x 2 di numeri casuali.
ans =
0.9502 0.4387 0.0344 0.3816
>>
Linguaggio di Matlab
Ciclo for
Il ciclo forpermette di iterare una porzione di codice, al variare di certi indici.
Essa viene espressa come
for (variabile = vettore)
< processo >
end
>> s=0;
>> for j=1:10
% assegna alla variabile "s" il valore corrente cui si somma "j".
s=s+j;
end
% Passo passo, la variabile j assume:
% il valore 1 ed s=s+j=0+1=1;
% il valore 2 ed s che precedentemente valeva 1,
% ora essendo s=s+j=1+2 vale 3.
% si itera il processo fino a che j=10 (incluso) e alla fine s=55.
% In effetti, la somma dei primi n numeri interi positivi
% vale n * (n+1)/2 che nel nostro caso e' proprio 55.
Linguaggio di Matlab
Ciclo while
Simile alciclo for è ilciclo while che
itera il processo ogni volta che una certa condizione è vericata, termina il processo la prima volta in cui tale condizione è falsa.
while (espressione logica)
< processo >
end
>> s=0; j=1;
>> while j < 10 s=s+j;
j=j+1;
end
>> s s = 45
% Qui si itera finche' j e' strettamente minore di
% 10, dovendo essere il test j < 10 verificato.
% Quindi l'ultimo j sommato a s e' 9 ed e' per questo
% che la somma vale 45=9 * 10 /2.
Linguaggio di Matlab
Legame tra ciclo while e ciclo for
La dierenza tra ciclo for e ciclo while consiste nel fatto che for è utilizzato quando è noto il numero di volte in cui compiere il ciclo mentre while quando questa conoscenza non è nota. Esempio:
>> iter=0; err=100; % Esempio 1
>> while (err > 1e-8 && iter <= 100) iter=iter+1;
err=err*rand(1);
>> err=100; % Esempio 2end
>> for iter=1:100 err=err*rand(1);
if err <= 1e-8 return;
end end
Notare che i due esempi sono equivalenti. Inoltre, All'interno di cicli while o for il comando di return può essere sostituito dal comando break.