Sei sulla pagina 1di 80

F I L I PPO CACACE

APPUNT I DI MAT L AB
DI SPONI BI L E ON- L I NE
Copyright 2014 Filippo Cacace
questa dispensa disponibile on-line
http://moodle.unicampus.it
Il codice contenuto in questa dispensa liberamente disponibile, copiabile e modicabile. Nessuna garanzia
fornita sulla sua correttezza.
Prima edizione, April 2014
Contents
Capitolo 1 Linterfaccia di Matlab e le espressioni numeriche 13
Capitolo 2 Matrici e vettori 19
Capitolo 3 Polinomi, numeri complessi, successioni e serie numeriche 39
Bibliography 49
Index 51
List of Figures
1 Esempio di nestra di interfaccia di Matlab con i componenti
standard. 13
List of Tables
1 Funzioni matematiche di base. 15
2 Costanti predenite. 17
3 Funzioni per la conversione del tipo dei dati. 18
4 Funzioni che creano matrici. 20
5 Funzioni su matrici. 22
6 Funzioni aggregate su vettori o matrici. 24
7 Operatori logici elementari 25
8 Connettori logici 25
9 Operazioni logiche aggregate 27
Introduzione
Lo scopo principale di questa dispensa di costituire il materiale
didattico della parte relativa a Matlab
r
del corso di Fondamenti di
Informatica svolto al Campus Bio-medico. Non si tratta perci di
un manuale completo dellambiente di calcolo numerico offerto da
Matlab
r
e neanche di un testo sulla soluzione numerica di problemi
mediante tale applicazione.
Per questo motivo lesposizione segue lo schema delle lezioni e
ho inoltre cercato di privilegiare la sintesi nella descrizione dei co-
mandi e delle opzioni, rimandando a testi pi specici o al manuale di
riferimento una descrizione dettagliata.
Lesposizione presuppone che il lettore possieda gi un minimo
di familiarit con la sintassi di linguaggi imperativi come il C, in
particolare con il modo di scrivere espressioni matematiche.
Il contenuto della dispensa concerne le operazioni di base con
matrici e vettori, e le applicazioni fondamentali al calcolo numerico.
Una parte signicativa del materiale riguarda la programmazione in
Matlab
r
e la programmazione di applicazioni con interfacce grache.
Nelle applicazioni ed esempi numerici ho tenuto presente gli ar-
gomenti tipici che gli studenti del I anno di Ingegneria affrontano nei
corsi di Geometria, Analisi e Fisica e che si prestano a essere affrontanti
con strumenti di calcolo numerico.
Capitolo 1 Linterfaccia di Matlab e le espressioni nu-
meriche
Componenti della GUI di Matlab
Struttura della GUI
Linterfaccia graca di Matlab divisa in alcune sezioni che possono
essere strutturate in modi diversi a seconda delle versioni e delle im-
postazioni scelte. I suoi componenti fondamentali sono i seguenti:
la command window (CW) contiene un interprete di righe di comandi
e serve per lesecuzione interattiva di comandi e la visualizzazione
dei risultati. La CW riconoscibile per la presenza del
prompt dei comandi .
il current folder (CF, cartella corrente) un pannello che contiene
lelenco dei le e cartelle della directory corrente. I programmi
che possono essere eseguiti sono quelli contenuti nel CF, oltre ai
programmi predeniti di libreria contenuti in genere nella cartella
.../MATLAB/R201X/toolbox/. Il CF pu essere modicato con i pul-
santi di navigazione della barra dei menu. Il CF visualizzato anche in una casella
della barra dei menu.
il workspace (WS) contiene lelenco delle variabili attualmente denite
nellambiente della CW e alcune informazioni sul lro tipo, dimen-
sione e valore.
la command history contiene la lista degli ultimi comandi eseguiti. Un comando pu essere eseguito nuo-
vamente selezionandolo dalla command
history.
leditor una sotto-nestra nella quale possono essere scritti pro-
grammi in Matlab (o, in generale, qualunque altro contenuto).
Figure 1: Esempio di nestra di interfac-
cia di Matlab con i componenti standard.
Uso della Command Window
Abitualmente lutente interagisce con lambiente di Matlab scrivendo
nella CW comandi terminati da <invio>. Linterprete comandi esegue i
comandi uno alla volta e mostra il risultato nella stessa CW.
Un comando lungo pu essere scritto su pi righe andando a capo
dopo ... e continuando sulla riga successiva.
14 appunti di matlab
Per tornare a un comando eseguito precedentemente e navigare
nella lista dei comandi da CW si possono usare le frecce e . Per
spostarsi allinterno di un comando si usano and .
Il comando viene eseguito solo andando a capo con <invio>. Se il
comando genera un risultato esso viene visualizzato.
>> 2+2
ans =
4
>>
Se il comando concluso con ; esso viene eseguito dopo <invio> ma
la visualizzazione del risultato soppressa:
>> 2+2;
>>
Alcuni comandi utili
Alcuni comandi di uso comune sono:
clc cancella il contenuto della CW. clc
clear cancella le variabili denite no a quel momento (il WS si
svuota). clear
dir elenca il contenuto del CF. dir
format compact sopprime le righe bianche tra comando e risultato
producendo un output pi compatto. format compact
diary on / diary off permettono di creare un le di testo nel CF
contenente i comandi eseguiti nella CW e i relativi risultati. Il nome
del le diary, se non altrimenti specicato. In tal modo possibile
tenere traccia delle operazioni effettuate in una sessione di lavoro. diary
help <nome comando> scrive sulla CW la spiegazione relativa a un
comando predenito o a una funzione. help
Le espressioni numeriche
Le espressioni numeriche contengono
operandi: costanti numeriche, variabili e funzioni.
operatori: operazioni aritmetiche e funzioni.
modicatori dellordine di precedenza delle operazioni: ( ).
Le funzioni sono operatori, perch trasformano il loro argomento (che
pu a sua volta essere unespressione) in un risultato, che pu divenire
un operando usato nel resto dellespressione.
capitolo 1 linterfaccia di matlab e le espressioni numeriche 15
Le operazioni aritmetiche sono +, -,
*
e /. Come di consueto,
*
e /
vengono valutate prima di + e - e le parentesi sono usate per modicare
lordine di valutazione delle operazioni. Quindi 6/2+1 d come risultato
4, mentre 6/(2+1) d come risultato 2.
Alcune delle operazioni matematiche pi comuni sono riportate in
Tabella 1.
funzione comando Matlab
x
n
xn

x sqrt(x)
sin(x) sin(x)
cos(x) cos(x)
tan(x) tan(x)
e
x
exp(x)
log(x) log(x)
log
10
(x) log10(x)
|x| abs(x)
x! factorial(x)
Table 1: Funzioni matematiche di base.
Assegnamenti, variabili e formato dei numeri
Assegnamenti
Il tipo di istruzione pi comune nei linguaggi di programmazioen
lassegnamento, che assegna un valore a una variabile e ha il formato
<variabile> = <espressione>;
Il lato sinistro sempre una variabile (o una parte di essa se la
variabile una matrice o un vettore, v. oltre), il lato destro contiene
unespressione che in particolare pu essere una costante numerica,
unaltra variabile, una funzione, ecc. Se viene omesso il ; nale il
valore assegnato viene scritto in uscita nella CW. La presenza del ;
sopprime la visualizzazione del valore.
Se il risultato di unespressione non assegnato a una variabile
specicata il suo valore viene sempre assegnato alla variabile predenita
ans: ans
>> a=log(2)
a=
0.6931
>> log(2)
ans=
0.6931
16 appunti di matlab
Variabili
Le variabili in Matlab sono create direttamente con un assegnamento,
non necessitano di dichiarazione e possono cambiare tipo. Il tipo di
una variabile pu essere modicato assegnando ad essa un valore
di tipo diverso. Per tipo si intende non solo il tipo di dato (stringa,
numero), ma anche la dimensione nel caso di una matrice o di un
vettore. Maiuscole e minuscole sono interpretate come diverse nei nomi
di variabili.
Per vedere il valore assegnato a una variabile si usa il nome di
variabile da solo senza ;
>> a=log(2);
>> a
a=
0.6931
Formato dei dati
Le stringhe in Matlab sono sequenze di caratteri di qualunque tipo
racchiuse tra apici singoli, ad esempio ciao.
I numeri in virgola mobile sono rappresentati con approssimativamente
16 cifre decimali. Nella CW vengono visualizzate 5 o 16 cifre decimali,
la scelta viene fatta mediante le istruzioni format short (5 cifre, default)
o format long (16 cifre). I numeri vengono rappresentati con un fattore
di scala, indicato con e seguito da una potenza di 10, positiva o
negativa. Quindi, ad esempio, 1.23e+02 123, mentre 1e-2 0.01. Il
fattore di scala un intero tra 308 e +308, quindi i numeri in Matlab
sono inclusi approssimativamente nellintervallo 10
308
,10
308
, e il pi
piccolo numero diverso da 0 circa 10
308
(v. il prossimo paragrafo,
costanti realmax e realmin). format short, format long
I numeri immaginari sono rappresentati aggiungendo il sufsso i o
j a un numero reale. Ad esempio -4e-1i il numero 0.4i.
Costanti predenite
Le costanti predenite di Matlab sono elencate nella Tabella 2.
I nomi delle costanti non sono riservati e possono essere usati come
nomi di variabili. Quindi un assegnamento come pi=1 rende non
pi disponibile il valore di no a quando la variabile pi rimane
presente nel WS. Dato che nella scrittura di programmi i nomi di
variabili i e j sono usati frequentemente, esistono altri due costanti che
corrispondono allunit immaginaria, 1i e 1i. Il numero di Nepero e
non una costante predenite, ma naturalmente il suo valore si pu
ottenere con exp(1).
capitolo 1 linterfaccia di matlab e le espressioni numeriche 17
costante valore commento
pi 3.1415926... pi greco
i, j, 1i, 1j

1 unit immaginaria
eps 2
52
2.22 10
16
precisione in virgola mobile
realmin 2
1022
2.23 10
308
numero pi piccolo
realmax (2 e)2
1023
1.7977 10
308
numero pi grande
Inf - innito
NaN - non un numero
Table 2: Costanti predenite.
La costante eps la precisione in virgola mobile, quindi se due
numeri differiscono di meno di eps sono considerati lo stesso numero.
Inf si ottiene dividendo un valore non nullo per 0 o quando si supera
il valore di realmax. NaN il risultato che si ottiene quando si valutano
espressioni come 0/0 o InfInf, 1Inf, che non hanno un valore
denito. Inf, NaN
Tipi di dati e conversioni
I tipi di dati elementari disponibili in Matlab sono stringhe e numeri.
I numeri possono essere interi, virgola mobile e complessi. Alcune
conversioni tra valori sono implicite o immediate perch non implicano
un cambiamento di valore numerico, per esempio da intero a virgola
mobile, o da un complesso a una coppia di numeri in virgola mobile (i
numeri complessi sono trattati a parte pi avanti).
Notare che sempre possibile convertire un numero in una stringa
ma il viceversa possibile solo se la stringa rappresenta un numero.
In caso contrario, str2double() restituisce NaN e str2num() restituisce
la matrice vuota, []. La differenza tra le funzioni str2double() e
str2num() che la prima converte una stringa in un solo numero in
virgola mobile, mentre la seconsa pu essere usata su una stringa che
contiene una amtrice o un vettore di numeri.
18 appunti di matlab
conversione funzione spiegazione & esempi
virgola mobile interi fix() parte intera
fix(2.7)= 2,
fix(-2.7)= 2
floor() intero minore
floor(2.7)= 2,
floor(-2.7)= 3
ceil() intero superiore
ceil(2.7)= 3,
ceil(-2.7)= 2
round() intero pi vicino
round(2.7)= 3,
round(-2.7)= 3
stringhe virgola mobile str2num() possibile se la stringa un
numero
str2num(1.2e-1)= 0.12
str2double() possibile se la stringa un
numero
str2double(1.2e1)= 12
interi stringhe int2str() valida se il numero
intero
int2str(-2)= 2
virgola mobile stringhe num2str() valida sempre
num2str(pi)= 3.1416
Table 3: Funzioni per la conversione del
tipo dei dati.
Capitolo 2 Matrici e vettori
In molti linguaggi di programmazione, come ad esempio il C, possi-
bile denire vettori e matrici attraverso array a una o pi dimensioni.
Tuttavia le operazioni aritmetiche e logiche del linguaggio riguardano
solo singoli elementi. Non possibile ad esempio moltiplicare due
matrici o trovare il massimo elemento di un vettore senza una scansione
degli elementi. In Matlab invece le variabili sono sempre matrici e le
operazioni aritmetiche e logiche hanno come operandi intere matrici.
Scalari e vettori sono un caso particolare in cui una o entrambe le
dimensioni sono pari a 1.
In generale, le matrici possono avere qualunque numero di dimen-
sioni, ma nella trattazione si far sempre riferimento a matrici a 2
dimensioni caratterizzate quindi dal numero di righe e di colonne.
Denizione di matrici e vettori
Le matrici si deniscono usando loperatore di composizione [ ] per
raggruppare due o pi elementi di tipo numerico. Gli elementi sulla
stessa riga sono separati con la virgola , o con uno spazio bianco,
le righe sono separate con il punto e virgola ;. La composizione
richiede conformit nelle dimensioni: tutte le righe devono avere lo
stesso numero di colonne o equivalentemente, tutte le colonne devono
avere lo stesso numero di righe. La composizione pu essere innestata:
F=[[ A,B]; C, D]
Esempio 1 La denizione delle seguenti matrici e vettori
A =
_
1 2
0 0.1
_
, v =
_

_
e
3
2
3
4
_

_, C =
_
0 0
0 0
_
si ottiene con
>> A = [ -1, 2 ; 0, 1e-1];
>> v = [exp(3); -2; 3/4];
>> P = [pi, 0; 0, pi]; C = [P , P];
20 appunti di matlab
Alcune funzioni per generare matrici speciali sono riportate in
Tabella 4. Se usate con un solo parametro restituiscono una matrice
quadrata di dimensione pari al valore del parametro. zeros(), ones(), eye(), rand(), randn()
funzione matrice
zeros(n,m) matrice n m di zeri
ones(n,m) matrice n m di 1
eye(n) matrice unit n n
rand(n,m) matrice n m di numeri casuali
randn(n,m) matrice n m di numeri casuali, distribuzione normale
Table 4: Funzioni che creano matrici.
Esempio 2 Creare un vettore di 10 interi casuali compresi tra 20 e 20.
Lintervallo ha unampiezza di 40, e i numeri appartententi a questintervallo i valori generati da rand(n,m) hanno una
distribuzione uniforme in in [0, 1].
possono essere generati estraendo numeri in [0, 1], moltiplicandoli per 40
e sottraendo 20. Per rendere interi i numeri casuali cos generati si usa la
funzione round(), che come tutte le funzioni gi introdotte in precedenza si
pu utilizzare indifferentemente su matrici o scalari.
>> v= round(rand(1,10)
*
40-20)
v =
-14 19 18 -1 12 -14 -3 17 12 18
Notare che se al posto di round() si usa fix(), i numeri generati appartengono
allintervallo [19, 19]. Analogamente, con ceil() si avrebbero numeri in
[19, 20] e con floor() in [20, 19], dal momento che 0 e 1 vengono estratti
con probabilit 0.
Per ricavare le dimensioni una matrice gi esistente si usa la funzione
size(), che restituisce il numero di righe e colonne, o la funzione
length() che restituisce la dimensione maggiore size(), length()
>> A= rand(4,3);
>> size(A)
ans =
4 3
>> length(A)
ans =
4
Esempio 3 Data una matrice A, creare una matrice B delle stesse dimensione
e con tutti gli elementi pari a 1
>> B= ones(size(A));
Un vettore corrispondente a un intervallo di valori tra a e b, con
a b, si ottiene con loperatore : intervalli di valori
capitolo 2 matrici e vettori 21
>> v= a:b;
Il vettore v corrisponde a [ a, a + 1, a + 2, . . . , b ]. Pi in generale,
lespressione
>> v= a:d:b;
genera il vettore [ a, a + d, a +2d, . . . , b ]. In questo caso, d pu essere
negativo, e a b.
Operazioni e funzioni su matrici
Operazioni algebriche su matrici
Le operazioni aritmetiche tra matrici sono la somma (+), la differenza
(-) e il prodotto (
*
), che seguono le regole dellalegebra tra matrici.
Quindi la somma e le differenza richiedono operandi con le stesse
dimensioni, mentre la regola di conformit del prodotto richiede che il
numero di colonne della primo operando sia uguale al numero di righe
del secondo. Il prodotto tra matrici, come noto, non commutativo.
Le operazioni di divisione a sinistra e a destra , / e \ sono cos
denite
A/ B = A B
1
B \A = B
1
A
e sono quindi soggette alle regole di conformit del prodotto. somma di matrici e scalari
possibile sommare uno scalare k a una matrice M, di dimensione
qualunque, con lespressione M+k. Questa espressione non obbedisce
alle regole di pari dimensione nelle somme, ma un abbreviazione per
lequivalente espressione M+ones(size(M))
*
k
soluzione di sistemi di equazioni lineari
Esempio 4 Risolvere il sistema di equazioni lineari
2x
1
x
2
= 1
x
1
+3x
2
= 1
Il sistema pu essere riscritto sotto forma matriciale come Ax = b, dove
A =
_
2 1
1 3
_
, x =
_
x
1
x
2
_
, b =
_
1
1
_
.
La soluzione pu quindi essere ottenuta come x = A
1
b = A\b:
>> x= A\b
ans =
0.40000
-0.20000
22 appunti di matlab
Altre operazioni su matrici
Le funzioni elencate nella Tabella 5 sono speciche di matrici o vettori.
Notare che in alcuni casi (determinante, autovalori, potenza, inversa,
ecc.) loperando deve essere una matrice quadrata, mentre in altri
(rango, trasposta) pu avere dimensioni generiche. Lo stack di una
matrice A, generato da A(:), il vettore colonna ottenuto concatenando
verticalmente le colonne di A.
Le funzioni logm(), expm() e sqrtm() sono il logaritmo e lesponenziale
di matrice a la radice quadrata di matrice, denite solo per matrici logm(), expm(), sqrtm()
quadrate. Lesponenziale di matrice si denisce come
e
A
=

i=0
1
i!
A
i
. (1)
Evidentemente tale operazione richede che A sia quadrata e il risultato
non lesponenziale dei singoli elementi di A. Il logaritmo linverso
dellesponenziale mentre la radice matriciale di A naturalmente la
matrice B tale che A = B
2
, la quale, di nuovo, non coincide con la ma-
trice composta dalle radici quadrate degli elementi di A. Lapplicazione
di funzioni scalari a tutti gli elementi di una matrice verr descritta
nella prossima sezione.
funzione risultato
A trasposta coniugata
A. trasposta
transpose(A) trasposta
A(:) stack di A
det(A) determinante di una matrice quadrata
rank(A) rango di A
inv(A) inversa di A
eig(A) vettore di autovalori di A
diag(A) vettore con la diagonale della matrice A
diag(v) matrice avente per diagonale il vettore v
trace(A) traccia della matrice A (somma della diagonale)
An potenza della matrice quadrata A
logm(A) logaritmo di matrice di A
expm(A) esponenziale di matrice di A
sqrtm(A) radice quadrata di matrice di A
Table 5: Funzioni su matrici.
Operazioni e funzioni sugli elementi di una matrice
Le operazioni considerate nora hanno come openrandi intere ma-
trici o vettori. possibile eseguire operazioni aritmetiche o funzioni
matematiche sui singoli elementi di una matrice o di un vettore.
capitolo 2 matrici e vettori 23
Le operazioni aritmetiche elemento per elemento sono:
moltiplicazione: A.
*
B denota il prodotto elemento per elemento di
A e B. Ovviamente questa operazione commutativa.
divisione: A./B denota la divisione elemento per elemento di A e B.
potenza: A.n denota la potenza dei singoli elementi di A.
Notare che A.
*
B e A./B richiedono che A e B abbiano la stessa dimen-
sione. Nella potenza A pu avere qualunque dimensione (a differenza
di An che richiede che A sia quadrata). Se A e B hanno la stessa
dimensione, possibile anche scrivere A.+B e A.-B, ma questo rispet-
tivamente equivalente a A+B e A+B
Tutte le funzioni che si applicano a scalari si possono applicare anche
a matrici e vettori e sono calcolate elemento per elemento, ad esmepio
sin(A), sqrt(A), abs(A), round(A), ecc.
Luso di espressioni e funzioni su un vettore permette di calcolare funzioni su un insieme di valori
lespressione o funzione su tutti gli elementi del vettore senza bisogno
di iterazioni.
successioni numeriche
Esempio 5 Calcolare i primi 10 elementi della successione a
n
= sin(1/n).
Come primo passo si denisce un vettore contenente i primi 10 interi. Il
secondo passo calcolare sin(1/x) su tutti gli elementi del vettore.
>>> n=1:10;
>>> an=sin(1./n)
ans =
Columns 1 through 7:
0.841471 0.479426 0.327195 0.247404 0.198669 0.165896 0.142372
Columns 8 through 10:
0.124675 0.110883 0.099833
calcolo numerico di funzioni
Esempio 6 Rappresentare con una tabella le coppie di valori (x, f (x)) per
x [0, 1], con incrementi di 0.1, e f (x) = x
2
e
x
/(x
3
+1).
Il primo passo denire il vettore dei valori di x. Successivamente si calcola
f (x) su tutti gli elementi del vettore. Inne si visualizzano i due vettori
afancati.
>>> x=0:0.1:1;
>>> f=x.^2.
*
exp(-x)./(x.^3+1);
>>> [x f]
ans =
0.00000 0.00000
0.10000 0.00904
0.20000 0.03249
0.30000 0.06492
0.40000 0.10080
24 appunti di matlab
0.50000 0.13478
0.60000 0.16248
0.70000 0.18118
0.80000 0.19019
0.90000 0.19047
1.00000 0.18394
Operazioni aggregate su matrici
Si deniscono funzioni aggregate le funzioni, come la sommatoria o il
massimo, che calcolano un valore a partire da un insieme. Le principali sum(), min(), max(), mean(), std()
funzioni aggregate sono riportate in Tabella 6.
funzione risultato
sum(A,n) sommatoria di A lungo lindice n = 1, 2
media(A,n) media di A lungo lindice n = 1, 2
std(A,n) scarto quadratico medio di A lungo lindice n = 1, 2
min(A,B) minimo elemento per elemento tra A e B
min(A,[],n) minimo di A lungo lindice n = 1, 2
max(A,B) massimo elemento per elemento tra A e B
max(A,[],n) minimo di A lungo lindice n = 1, 2
Table 6: Funzioni aggregate su vettori o
matrici.
Se la funzione aggregata appplicata a un vettore, il risultato uno
scalare e non occorre specicare ulteriori parametri. Se la funzione una funzione scalara applicata a una ma-
trice produce un vettore, applicata a un
vettore produce uno scalare
applicata a una matrice occorre specicare se applicarla alle righe o alla
colonne mediante il parametro n. Con n = 1 la funzione applicata
alle righe, con n = 2 alle colonne. Se non viene specicato si assume
n = 1.
Notare che lapplicazione di una funzione aggregata a una matrice
produce un vettore riga o colonna a seconda che venga appplicata
lungo le colonne o le righe, ad esempio
>> A=round(rand(3)
*
10)
A =
4 7 0
7 0 1
2 3 8
>> sum(A,1)
ans =
13 10 9
>> sum(A,2)
ans =
11
8
capitolo 2 matrici e vettori 25
13
Di conseguenza, per calcolare la funzione aggregata allintera matrice
occorre applicarla di nuovo al vettore risultante,
>> sum(sum(A))
ans =
32
Le funzioni min() e max() hanno anche una forma alternativa con
due operandi di uguale dimensione (matrici o vettori). In tal caso il
risultato ha le stessa dimensione degli operandi e contiene il minimo (o
il massimo) elemento per elemento. anche possibile usare uno scalare
in uno dei due operandi: il confronto viene fatto tra i singoli elementi
della matrice o vettore e lo scalare.
>> max(A,4)
ans =
4 7 4
7 4 4
4 4 8
Operazioni ed espressioni logiche su matrici
Le espressioni logiche calcolano valori booleani (true e false, indicati
come 1 e 0) a partire da operandi numerici, matrici, vettori e scalari,
o alfanumerici. Le espressioni logiche si costruiscono componendo
operazioni elementari di confronto (vedi Tabella 7) mediante connettori
logici di tipo AND, OR, NOT (vedi Tabella 8).
operatore risultato
== uguaglianza
> maggiore
>= maggiore o uguale
< minore
<= minore o uguale
~= diverso
Table 7: Operatori logici elementari
connettore risultato
&& AND tra scalari
& AND tra matrici o vettori
|| OR tra scalari
| OR tra matrici o vettori
NOT
Table 8: Connettori logici
26 appunti di matlab
Luso degli operatori logici in Tabella 7 su matrici e vettori simile
a quello delle operazioni aritmetiche elemento per elemento. I due
operandi devono avere le stesse dimensioni e il risultato una matrice
o vettore booleano che ha ancora le stesse dimensioni. Come nel caso
delle operazioni artimetiche elemento per elemento, lunica eccezione
la possibilit che uno dei due elementi sia uno scalare. In tal caso
ogni elemento dellaltro operando viene confrontato con lo scalare. Ad
esempio, A > 0 genera una matrice booleana contente 1 nelle posizioni
occupate da elementi positivi di A, e 0 altrove.
Va notato che i valori booleani 0 e 1 vengono interpretati come
numeri quando usati in operazioni artimetiche. Questo permette una contare il numero di elementi che soddis-
fano una propriet
notevole essibilit nellusare il risultato di unoperazione logica su
matrici per contare il numero di elementi che soddisfano una propriet.
Esempio 7 Generare una matrice 4 4 di interi casuali tra 10 e 10 e
calcolare il numero di elementi positivi.
>> A=round(rand(4)
*
20-10)
A =
6 -6 -3 8
-5 -5 7 -4
9 2 2 5
-3 -1 1 5
>> A>0
ans =
1 0 0 1
0 0 1 0
1 1 1 1
0 0 1 1
>> sum(sum(A>0))
ans =
9
Un altro esempio di utilizzo delle matrici booleane in operazioni
artimetiche la possibilit di usare la matrice come una maschera di maschere booleane di selezione
selezione degli elementi che soddisfano una data propriet, attraverso
la moltiplicazione elemento per elemento, come nel seguente esempio.
Esempio 8 Generare una matrice 4 4 di interi casuali tra 10 e 10 e porre
uguali a 0 tutti gli elementi non positivi.
>> A=round(rand(4)
*
20-10)
A =
6 -6 -3 8
-5 -5 7 -4
9 2 2 5
capitolo 2 matrici e vettori 27
-3 -1 1 5
>> A>0
ans =
1 0 0 1
0 0 1 0
1 1 1 1
0 0 1 1
>> A.
*
(A>0)
ans =
6 0 0 8
0 0 7 0
9 2 2 5
0 0 1 5
Viceversa, i valori numerici 0 e 1 possono essere usati come valori
booleani, ad esempio in un connettore logico AND o OR. In questo
caso, si possono per usare anche le costanti simboliche false, true
che rendono lespressione logica pi leggibile.
I connettori && e || possono essere usati solo su operandi scalari. Il
loro uso naturale nelle espressioni booleane usate as esempio nelle
istruzioni di controllo if e while descritte pi avanti, che sono per loro
natura scalari. Per comporre invece mediante AND, OR o NOT matrici
o vettori booleani si usano i connettori &, | e .
funzione risultato
any(B,n) quanticatore esistenziale di B lungo lindice n = 1, 2
all(B,n) quanticatore universale di B lungo lindice n = 1, 2
Table 9: Operazioni logiche aggregate
I quanticatori logici indicati nella Tabella 9 sono lequivalente quanticatori logici
logico delle operazioni aggregate. Entrambi calcolano un valore logico a
partire da un vettore di valori logici. La funzione any(B,n) presuppone
che B sia una matrice o vettore logico, e ha come risultato 0 se nessun
elemento vale 1, oppure 1 se almeno un elemento vale 1. quindi
lanalogo del quanticatore logico e viene applicato lungo le colonne
o le righe della matrice a seconda che n = 1 o n = 2, rispettivamente.
Se loperando un vettore booleano viene applicato lungo la sua
dimensione maggiore di 1 qualunque essa sia.
Analogamente, all(B,n) lequivalente di . Vale 1 se tutti gli
elementi valgono 1, altrimenti vale 0.
Luso dei quanticatori logici permette di esprimere in modo com-
patto propriet logiche complesse su matrici, evitando quasi sempre il
ricorso a cicli di ricerca o verica di propriet .
Esempio 9 Date due matrici A e B determinare quante colonne di A con-
tengono almeno un elemento maggiore del corrispondente elemento di B.
28 appunti di matlab
Per costruire lespressione che risponde al problema pu essere conveniente
partire dalla matrice booleana ottenuta dal confronto elemento per elemento di
A e B
>> A=round(rand(3)
*
5)
A =
2 4 0
3 0 0
1 1 4
>> B=round(rand(3)
*
10)
B =
7 0 8
3 4 8
10 4 2
>> A>B
ans =
0 1 0
0 0 0
0 0 1
Per rispondere alla domanda occorre contare quante colonne di A > B con-
tengono almeno un 1. Lespressione desiderata quindi
>> sum(any(A>B))
ans =
2
Indici delle matrici
Luso di indici per indicare parte di una matrice o di un vettore costitu-
isce in Matlab un meccanismo molto essibile. Una buona padronanza
di questo meccanismo permette spesso di scrivere espressioni compatte
ed efcienti per eseguire operazioni complesse.
Indici scalari
Il principio di base, molto semplice, comune ad altri diffusi linguaggi
di programmazione: lelemento sulla riga r e colonna c di una matrice
viene indicato come
M(r,c)
dove r e c sono interi positivi detti indici dell elemento. da notare luso di valori non positivi o non interi
come indici di una matrice produce sem-
pre un errore
che in Matlab, diversamente da quanto avviene in C, gli indici partono
da 1 e non da 0.
Una matrice ha due dimensioni, per questo un elemento indicato
da una coppia di indici separati da una virgola. Il primo indice luso della virgola per separare gli indici
obbligatorio, a differenza di quanto
avviene in unoperazione di compo-
sizione con [ ]. In quel caso luso
della virgola per separare gli elementi
opzionale perch lo spazio bianco suf-
ciente
capitolo 2 matrici e vettori 29
si riferisce alle righe, numerate partendo dallalto, e il secondo alle
colonne, numerate a partire da sinistra. Sintatticamente, gli elementi
di una matrice sono denotati con il nome della matrice seguito da
una coppia di parentesi tonde ( ) che contiene gli indici separati dalla
virgola.
Se r e c sono scalari, M(r,c) equivale a una variabile scalare che pu
essere usata come operando in unespressione o alla quale possibile
assegnare un valore. Naturalmente, se si usa il valore di M(r,c), ad per usare il valore di un elemento occorre
usare indici minori o uguali alla dimen-
sione della matrice
esempio come operando in unespressione, tale valore deve esistere gi
. In questi casi r e c devono essere minori della corrispondente dimen-
sione. Quindi, se la matrice ha dimensione mn, il primo indice deve
appartenere allinsieme 1, 2, . . . , m e il secondo a 1, 2, . . . , n. Luso di
indici non appartenenti a questi intervalli produce un errore.
Quando invece M(r,c) viene usato per assegnare un valore a un
elemento della matrice, possibile che sia r > m e c > n. In tal assegnando un valore a un elemento oltre
i limiti di riga e/o colonna di una matrice,
la matrice viene estesa
caso, la matrice viene estesa no allelemento specicato, quindi il
suo numero nale di righe sar pari al massimo tra r e m e il numero
nale di colonne pari al massimmo tra c e n. Gli elementi aggiunti per
estendere la matrice, per i quali nellassegnamento non sia specicato
un valore, assumono il valore 0.
I due diversi meccanismi sono riassunti nel seguente esempio:
>> a=1
a =
1
>> a(2,2)=1
a =
1 0
0 1
>> b=a(2,3)+1
??? Index exceeds matrix dimensions.
Luso di indici per riferirsi agli elementi di un vettore analogo.
Dato che il vettore ha una sola dimensione, occorre un solo indice. i vettori hanno un solo indice, oppure
due indici almeno uno dei quali vale 1
Tuttavia, dal momento che un vettore anche una matrice con una sola
riga o una sola colonna, possibile usare due indici purch il primo
indice sia pari a 1 per un vettore riga o il secondo sia pari a 1 per un
vettore colonna.
>> v=[8 -3]
v =
8 -3
>> v(2)
ans =
-3
>> v(1,2)
30 appunti di matlab
ans =
-3
>> v(2,1)
??? Index exceeds matrix dimensions.
Anche nel caso di matrici possibile usare un solo indice. In questo
caso la matrice viene trattata come un vettore ottenuto concatenando
verticalmente le sue colonne (lo stack della matrice). Quando lindice
della matrice unico, lelemento a cui ci si riferisce quello ottenuto
applicando lindice a tale vettore. Notare che lelemento in posizione r, c
della matrice di dimensioni mn si trova nella posizione (c 1) m+r
di tale vettore. Viceversa, lelemento in posizione i nel vettore di i = (c 1)m + r
r = 1 + mod (i 1, m), c = di/me
stack corrisponde allelemento sulla riga r = 1 + mod (i 1, m) a
sulla colonna c = di/me, dove dxe indica il pi piccolo intero x.
Per esempio, nel caso della seguente matrice 3 2, lelemento con
indice unico 4 corrisponde alla coppia di indici (1, 2).
>> M=round(rand(3,2)
*
10)
M =
6 5
2 2
3 8
>> M(4)
ans =
5
>> M(1,2)
ans =
5
Lequivalenza immediata se si visualizza lo stack di M:
>> M(:)
ans =
6
2
3
5
2
8
Indici vettoriali e intervalli di indici
Nella sezione precedente si considerato il caso in cui gli indici sono
valori scalari. Lelemento individuato con indici scalari unico ed
quindi anchesso scalare. Unimportante caratteristica dei Matlab
quella di permettere luso di vettori di indici. I vettori di indici devono
contenere valori interi e positivi.
capitolo 2 matrici e vettori 31
Quando uno solo degli indici un vettore il risultato un vettore,
ad esempio
>> v=round(rand(1,6)
*
10)
v =
9 4 2 9 10 4
>> v(2:4)
ans =
4 2 9
In questo caso il vettore di indici 2 : 4 = [2, 3, 4], generato come un
intervallo con incrementi unitari.
Quando entrambi gli indici sono vettori il risultato una matrice.
Ad esempio estrazione di minori di una matrice
>> M=round(rand(3,4)
*
10-5)
M =
0 3 2 -3
-4 -5 0 0
-2 4 1 5
>> M(1:3,2:4)
ans =
3 2 -3
-5 0 0
4 1 5
estrae il minore di M ottenuto cancellando la prima colonna. Nel costru-
ire gli intervalli indici si pu usare il valore speciale end che corrsiponde il valore speciale end e lintervallo spe-
ciale :
al massimo valore indice nella dimensione corrispondente. Ad esempio,
lo stesso minore prima si pu ottenere con M(1:end,2:end). Inoltre,
lintero intervallo di indici rispetto a una dimensione si pu indicare
con :, che corrsiponde a 1:end. Di conseguenza il minore precedente
si pu scrivere pi sinteticamente come M(:,2:end). Notare che luso
di : e end rende le espressioni indipendenti dalle dimensioni effettive
della matrice: non necessario specicare il numero totale di righe e/o
colonne.
Alcuni esempi di uso di indici vettoriali per riferirsi a parti di matrici:
esempi di intervalli di indici
M(r,:) la riga di indice r.
M(:,c) la colonna di indice c.
M(:,:) tutta la matrice M, equivalente a usare M.
M([3 5],[2 6] il minore di dimensione 2 costituito dai 4 elementi
M(3, 2), M(3, 6), M(5, 2), M(5, 6).
M([3 5], 2) il vettore colonna costituito da M(3, 2) e M(5, 2).
32 appunti di matlab
M([3 5],[2 2]) la matrice di dimensione 2 che ha come colonne
il vettore precedente.
M(1:2:end, 2:2:end) il minore cosituito da tutti gli elementi della
matrice aventi indice di riga dispari e indice di colonna pari.
Anche nel caso di indici vettoriali, nel lato sinistro di un assegna-
mento si possono usare intervalli di indici al di fuori della dimensione aggiunta di righe e colonne
attuale della matrice per estendere una matrice, per esempio con nuove
righe e colonne come nel seguente esempio.
Esempio 10 Data una matrice M aggiungere una colonna contenente la
media per righe della matrice.
La nuova colonna si pu indicare equivalentemente come M(:,end+1)
oppure M(1:end,end+1. Naturalmente, al posto di end+1 si pu usare il
valore effettivo dellindice della nuova colonna, se noto. Laggiunta di tale
colonna si scrive quindi
>> M(:,end+1) = mean(M,2)
dove il secondo argomento di mean() indica che la media va calcolata per ogni
riga e il risulato quindi un vettore colonna.
Loperazione opposta, cio leliminazione di righe e colonne, si
ottiene assegnando ad essere il valore [ ] (vettore vuoto). Ad esempio, cancellazione di righe e colonne
la seguente istruzione cancella lultima riga di una matrice M.
>> M(end, :) = [ ]
Naturalmente, tale assegnamento possibile se il risultato possiede
ancora righe (e colonne) tutte della stessa dimensione. Ad esempio, se
la matrice ha dimensione maggiore di 1, loperazione
>> M(1,1) = [ ]
produce un errore, perch la prima riga avrebbe dimensioni inferiori
alle altre.
Loperazione
>> M = []
assegna a M il vettore vuoto, cancellando tutti gli elementi presenti. Tale
operazione ha un effetto diverso da clear M, perche in questultimo
caso la matrice M non esiste pi , mentre dopo M=[ ] la matrice esiste
ancora e pu essere usata come operando, ad esempio:
>> M=[]
M =
[]
>> sum(M)
ans =
0
capitolo 2 matrici e vettori 33
Trovare gli indici degli elementi in base a propriet logiche
Le operazioni logiche introdotte nella precedente sezione Operazioni la funzione find()
ed espressioni logiche su matrici permettono di selezionare gli elementi
di una matrice o vettore che soddifano una propriet logica, oppure di
contare quanti elementi, righe o colonne godono di qualche propriet .
Un problema ulteriore quello di stabilire la posizione degli elementi
che soddisfano una propriet . Consideriamo ad esempio il problema
data una matrice trovare la colonna che contiene il massimo numero
di zeri. La risposta alla domanda consiste nellindice di una o pi
colonne, e per rispondere a domande come queste occorre mettere in
relazione il vericarsi di una condizione con la posizione, rappresentata
da indici, in cui si trovano gli elementi che la soddisfano.
La funzione Matlab che permette di fare questo si chiama find() e
nella sua forma pi semplice ha la seguente sintassi find() su matrici
[r c] = find(p)
dove p una propriet logica, cio unespressione che genera una
matrice booleana, e r, c sono due vettori tali che (r
i
, c
i
) costituisce
lindirizzo dei valori true/1 della matrice booleana. La dimensione dei
vettori r e c quindi pari al numero di true/1 nel risultato di p.
Ad esempio,
>> A
A =
2 4 0
3 0 0
1 1 4
>> B
B =
7 0 8
3 4 8
10 4 2
>> [r c]=find(A>B)
r =
1
3
c =
2
3
Pi specicamente, find(), seguendo una convenzione tipica del
linguaggio C, equipara qualunque valore non nullo a true. Quindi, se
p calcola una matrice numerica non booleana, find(p) restituisce gli
indici di tutti gil elementi non nulli.
34 appunti di matlab
Se invece di una matrice p genera un vettore booleano, find() si usa
con un solo vettore di risultati, find() su vettori
r = find(p)
Questa sintassi pu essere usata anche per le matrici, e in tal caso
le posizioni contenute in r fanno riferimento allindice unico della
matrice concatenata come un vettore (v. sopra).
La sintassi di find() prevede delle ulteriori varianti che non esamini-
amo analiticamente. Una variante utile la seguente, uso di find() trovare solo k elementi che
soddifano una propriet
[r c] = find(p, k, first)
[r c] = find(p, k, last)
che restituisce gli indici solo dei primi (first) o ultimi (last) k
elementi che soddisfano la propriet .
Esempio 11 Data una matrice A trovare gli indici delle colonne che con-
tengono il massimo numero di zeri.
Il massimo numero di zeri presenti su una colonna di A si determina, ad
esempio, con max(sum(A==0)). Il vettore sum(A==0) contiene, in effetti, il
numero di 0 presenti in ogni colonna di A. Confrontando tale vettore con il
suo massimo si ottiene un vettore booleano, nel quale il valore 1 corrisponde
alle colonne che hanno un numero di zeri pari al massimo. Lespressione che
risponde al problema posto quindi
find( sum(A==0) == max(sum(A==0)))
Indici logici
Lindicizzazione logica consiste nelluso di valori booleani per speci-
care gli elementi di una matrice. La matrice, o vettore, indicizzata con
una matrice booleano o con unespressione booleana invece che con
indici interi.
La sintassi per lindicizzazione logica di una matrice M
M(p)
dove p una matrice booleana o unespressione booleana della stessa
dimensione di M. Notare che se p unespressione non necessario loperando e lindice devono avere le
stesse dimensioni
che abbia come operando M, anche se questo il caso pi comune.
invece necessario che il suo risultato abbia le stesse dimensioni di M.
Va anche sottolineato che lindice logico unico sia per una matrice che
per un vettore. Con gli indici numerici occorrono invece due indici lindice logico unico
per una matrice e uno per un vettore. Questo perch il numero di
dimensioni dellindice (una o due dimensioni) deve coincidere con il
numero di dimensioni delloperando.
Il risultato di M(p) sempre un vettore, indipendentemente dal
fatto che M sia una matrice o un vettore. Se M una matrice la sua con lindicizzazione logica il risultato
sempre un vettore
capitolo 2 matrici e vettori 35
struttura quindi persa, perch M(p) solo lelenco degli elementi di
M che soddisfano la propriet .
Ad esempio, M(M > 0) genera un vettore contenente gli elementi
positivi di M, mentre M(N > 0), dove N una matrice delle stesse
dimensioni di M, genera un vettore contenente gli elementi di M che
si trovano nelle stesse posizioni degli elemeti positivi di N. Inne,
M(M > N) genera il vettore di elementi di M maggiori dei corrispon-
denti elementi di N.
Esercizi
Esercizio 1 Data una matrice casuale A 44 con valori tra 0 e 20,
ottenuta da A=rand(4), confrontare le matrici ottenute trasformando A
in interi rispettivamente con fix(), round(), floor(), ceil().
Esercizio 2 Creare una matrice 4 4 di interi casuali tra 0 e 20, e
assegnare a un vettore la diagonale principale.
Esercizio 3 Vericare che i vettori v = [2, 1, 3]
T
e w = [1, 4, 2]
T
sono ortogonali usando il prodotto scalare.
Esercizio 4 Generare un vettore colonna x, dimensione 5 1, di interi
casuali da 5 a 5 e calcolare il modulo. . es. 4: numericamente il modulo si pu ot-
tenere come radice quadrata della norma,
cio del prodotto scalare x
T
x, oppure
come radice quadrata della somma delle
componenti al quadrato
Esercizio 5 Dati i vettori v
1
= [1, 3, 2], v
2
= [0, 2, 10], calcolare
w = 3v
1
+ 2v
2
. Costruire poi la matrice A avente come righe i
vettori v
1
, v
2
e w e vericare che det(A) = 0 perch una delle righe
combinazione lineare delle altre.
Esercizio 6 Creata una matrice A di dimensione 5 3 di interi casuali
da 10 a 10, calcolare A
T
A e AA
T
e vericare che in entrambi i casi il
risultato ha rango 3.
Esercizio 7 Vericare numericamente su matrici casuali le propriet
(AB)
T
= B
T
A
T
e det(A
1
) = 1/det(A).
Esercizio 8 Creata una matrice A di dimensione 3 3 di interi casuali
da 5 a 5, vericare che le matrici A e e
A
commutano.
Esercizio 9 Creata una matrice A di dimensione 3 3 di interi casuali
da 5 a 5, vericare che
(i) A sia non singolare;
(ii) B = A
T
A simmetrica;
36 appunti di matlab
(iii) gli autovalori di B sono reali;
(iv) B
i
I
3
singolare, dove
i
sono gli autovalori di B e I
3
la
matrice identit di dimensione 3.
Esercizio 10 Dato il sistema di equazioni lineari
_

_
x
1
+2x
2
+4x
3
= 0
5x
1
3x
2
+ x
3
= 5
2x
1
+ x
2
+ x
3
= 5
Risolverlo con lalgebra delle matrici.
Esercizio 11 Generare una matrice 5 5 A di interi casuali da 10 a 10
e un vettore colonna b, 5 1, di interi nello stesso intervallo. Risolvere
il sisema di equazioni lineari Ax = b.
Esercizio 12 Generate le matrici A di dimensioni 3 2, B 3 4, C 2 2
e D 2 4, costruire le matrici
F =
_
A B
C D
_
, G =
_
A
T
C
B
T
D
T
_
Esercizio 13 Generata una matrice A di dimensioni 2 2, di interi
casuali da 5 a 5, costruire
A =
_
A A
2
A
3
A
4
_
,
e vericare che A ha lo stesso rango di A. Vericare che, viceversa, la
matrice

A ottenuta usando le potenze degli elementi di A invece che le
potenze di A pu avere rango massimo.
Esercizio 14 Dato il sistema di equazioni lineari
_

_
3x
1
+ x
2
x
3
= 1
x
1
x
2
3x
3
= 1
x
1
+ x
2
+ x
3
= 1
veircare che la matrice dei coefcienti singolare, ma il sistema
soddisfa le condizione del Teorema di Rouch-Capelli, rango(A) =
rango([Ab]) e quindi ammette soluzioni. es. 14: dato che rango(A) =
rango([Ab]) = 2, il sistema ha innite
soluzioni funzioni di un parametro, e
si risolve eliminando una delle incog-
nite (che diviene un parametro al quale
assegnare un valore), eliminando una
qualunque delle equazioni di partenza
e risolvendo il sistema residuo
Esercizio 15 Creare una matrice 43 di interi casuali da 0 a 15 e
calcolare i determinanti dei 4 minori di ordine 3 che si possono estrarre
dalla matrice.
capitolo 2 matrici e vettori 37
Esercizio 16 Data una matrice casuale quadrata A di dimensione 4,
aggiungere una riga corrispondente alla media per colonne di A.
Esercizio 17 Create 2 matrici casuali di interi A e B, con A di di-
mensioni 5 3 e B di dimensioni 2 5, creare la matrice C ottenuta
aggiungendo ad A una colonna corrispondente ai massimi per colonna
di B.
Esercizio 18 Costruita una matrice di interi casuali tra 50 a 50 di
dimensione 6 6, determinare il numero di elementi positivi e negativi
su ogni colonna.
Esercizio 19 Costruita una matrice A di interi casuali tra 0 e 100 di
dimensione 6 6, e assegnata una costante k 100, generare due
matrici B e C contententi rispettivamente solo gli elementi maggiori o
minori di k presenti in A, e 0 nelle rimanenti posizioni.
Esercizio 20 Costruita una matrice A di interi casuali tra 0 e 100 di
dimensione 6 6, e assegnata una costante k 10, modicare A
ponendo uguali a 0 tutti gli elementi che sono multipli di k. es. 20: usare la funzione mod(n,k)
Esercizio 21 Costruita una matrice A di interi casuali tra 0 e 100 di
dimensione 6 6, aggiungere una colonna contenente il numero di
elementi di ogni riga che sono maggiori della media dellintera matrice.
Esercizio 22 Determinare quanti numeri primi ci sono tra i primi 100
interi. es. 22: si pu utilizzare la fun-
zione isprime() che restituisce un val-
oer booleano vero/falso per ogni ele-
mento dellargomento che rispettiva-
mente primo o non primo
Esercizio 23 Costruita una matrice di interi casuali tra 0 e 100 di
dimensione 6 6, determinare quanti numeri primi ci sono in ogni
riga.
Esercizio 24 Costruita una matrice di interi casuali tra 0 e 100 di
dimensione 6 6, determinare:
quanti sono i numeri primi contenuti nella matrice;
quale il massimo numero di numeri primi presenti sulle colonne.
Esercizio 25 Costruita una matrice di interi casuali tra 0 e 100 di
dimensione 6 6, determinare quali sono le colonne che contengono il
massimo numero di elementi pari.
Esercizio 26 Costruite due matrici A e B di interi casuali tra 50 e 50
di dimensione 6 6, calcolare la somma per righe degli elementi di A
che sono maggiori dei corrispondenti elementi di B.
38 appunti di matlab
Esercizio 27 Dato un vettore v di 50 elementi casuali con distribuzione
uniforme compresi tra 0 20, calcolare il vettore di dimensione 4 che
contenga il numero di elementi di v compresi negli intervalli [0, 4],
[5, 10], [10, 15], [15, 20].
Esercizio 28 Trovare i valori di x nellintervallo [5, 5] che soddisfano
la disuguaglianza
x
2
+ x 2 > 1 x
es. 28: il vettore x va costruito con incre-
menti discreti, per esempio x=-5:0.1:5;
Esercizio 29 Data una matrice A di dimensione 3 10 composta da
interi casuali tra 0 e 10, dire se c almeno una colonna in cui compaiono
solo elementi maggiori della media.
Esercizio 30 Data una matrice A di dimensione 6 6, di interi casuali
tra 5 e 5, dire quali colonne contengono pi elementi positivi che
negativi (escludendo lo 0).
Capitolo 3 Polinomi, numeri complessi, successioni e serie
numeriche
Questo capitolo dedicato alla soluzione di problemi numerici di base:
equazioni algebriche, operazioni sui complessi, e le funzioni sui numeri
naturali.
Polinomi
I polinomi appartengono alla classe pi ampia delle funzioni di vari-
abile scalare, ma in Matlab possibile rappresentarli esplicitamente per
applicare funzioni speciche, come il calcolo delle radici, la somma o il
prodotto.
Un polinommio di grado n della variabile scalare x, rappresentazione di polinomi
p(x) =
n

i=0
a
i
x
i
(2)
viene rappresentato in Matlab con un vettore che ha come elementi i
coefcienti delle potenze di x in ordine decrescente,
p = [a
n
, a
n1
, . . . , a
1
, a
0
]. (3)
Nel rappresentare un polinomio come un vettore di coefcienti oc-
corre naturalmente inserire 0 come coefciente delle potenze mancanti,
quindi per esempio x
2
+ 1 rappresentato dal vettore [1 0 1]. Un
polinomio di grado n richiede quindi un vettore di dimensione almeno
n +1 per essere rappresentato.
Il calcolo del valore di un polinomio su uno o pi valori si esegue
con la funzione polyval(p,x), dove p un vettore che rappresenta un valore di un polinomio: polyval() e
polyvalm()
polinomio e x una matrice o vettore di valori sui quali calcolare il
polinomio. Quindi, polyval(p,x) corrisponde allespressione
p(1)
*
x.^n + p(2)
*
x.^(n-1) + ... + p(n-1)
*
x + p(n)
Per calcolare un polinomio su una matrice, cio p(X) dove X una
matrice quadrata, si usa invece la funzione polyvalm(p,X), che cor-
risponde allespressione
40 appunti di matlab
p(1)
*
X^n + p(2)
*
X^(n-1) + ... + p(n-1)
*
X + p(n)
Dalle regole algebriche dei polinomi chiaro che la somma o dif-
ferenza di due polinomi, cio il calcolo dei coefcienti di p
1
(x) p
2
(x) sommma e differenza di polinomi
si ottiene semplicemente sommando o sottraendo i vettori che li rapp-
resentano, se hanno la stessa dimensione. Questo perch la somma di
vettori richiede in Matlab luguaglianza delle dimensioni. Per sommare
o sottrarre due polinomi di grado diverso occorre rendere uguali le
dimensioni aggiungendo al vettore che rappresenta il polinomio di
grado minore un numero di 0 iniziali pari alla differenza di grado.
Il calcolo dei coefcienti del polinomio prodotto p
1
(x) p
2
(x) si prodotto di polinomi: conv()
effettua con la funzione conv(p1,p2). Ad esempio, il prodotto di
p
1
(x) = x
2
+1 con p
2
(x) = x
3
1 si ottiene con
>> p1=[1 0 1]
p1 =
1 0 1
>> p2=[1 0 0 -1]
p2 =
1 0 0 -1
>> conv(p1,p2)
ans =
1 0 1 -1 0 -1
che corrisponde al polinomio x
5
+ x
3
x
2
1.
Per la divisione di polinomi p
1
(x)/p
2
(x) occorre ricordare che se
p
1
(x) (di grado n) non divisibile per p
2
(x) (di grado m n) il divisione di polinomi: deconv()
risultato costituito da un polinomio q(x) di grado n m e da un resto
r(x) di grado al pi m1,
p
1
(x)
p
2
(x)
= q(x) +
r(x)
p
2
(x)
(4)
con r(x) = 0 solo nel caso in cui p
1
(x) divisibile per p
2
(x). Partendo
dalla rappresentazione vettoriale di p
1
(x) e p
2
(x), i polinomi risultato
della divisione si ottengono con la funzione deconv(),
[q r] = deconv(p1,p2)
La derivata di un polinomio ancora un polinomio, di grado inferi-
ore. Il calcolo dei coefcienti della derivata di un polinomio si effettua derivata di polinomi: polyder()
con la funzione polyder(),
d = polyder(p)
che restituisce un vettore di dimensione n 1 (se n la dimensione di
p) contenente i coefcienti della derivata. Usando la stessa funzione con
due parametri, d=polyder(a,b) si calcolano i coefcienti della derivata
del prodotto dei polinomi a(x) e b(x).
capitolo 3 polinomi, numeri complessi, successioni e serie numeriche 41
Nelle applicazioni spesso utile trovare i valori di x tali che p(x) = 0,
detti radici del polinomio. Per il Teorema fondamentale dellalgebra, soluzioni di equazioni algebriche:
roots()
un polinomio di grado n possiede n radici complesse. I loro valori si
possono trovare con la funzione roots(),
r = roots(p)
che restitusce un vettore r della stessa dimensione di p. Se p contiene
valori reali, i valori di r sono reali o coppie di complessi coniugati. La
funzione roots() il modo pi diretto per risolvere numericamente
equazioni algebriche.
La funzione inversa di roots() la funzione poly(), che, assegnato costruzione di polinomi con radici asseg-
nati: poly()
un vettore r di n radici restituisce i coefcienti di un polinomio di grado
n che si annulla sugli elementi di r,
p = roots(r)
Dal momento che tale polinomio unico a meno della moltiplicazione
per uno scalare, poly() restituisce il polinomio in cui il coefciente
di grado pi elevato (quindi il primo elemento di p) uguale a 1. I
coefcienti di p(x) sono quindi quelli che si ottengono eseguendo il
prodotto e raggruppando i termini dellespressione
(x r
1
) (x r
2
) . . . (x r
n
) (5)
Numeri complessi
I numeri complessi in Matlab non sono un tipo di dati a parte: sono
invece il tipo numerico pi generale, dei quali i reali costituiscono
un sottoinsieme. Di conseguenza tutte le operazioni aritmetiche e
matematiche denite nora si applicano indifferentemente a reali o
complessi e producono il risultato appropriato. Inoltre, matrici e vettori
possono avere elementi sia reali che complessi contemporaneamente
Alcune operazioni sui reali, come sqrt(-3) o roots([1 0 1]) gener-
ano risultati complessi, che Matlab rappresenta, come gi accennato nel
Capitolo 1, mediante la parte reale e immaginaria, questultima seguita
dal sufsso i, ad esempio
>> sqrt(-3)
ans =
0 + 1.7321i
Solo alcune funzioni manifestano differenze immediatamente intuitive
tra reali e complesse. Un esempio la funzione abs(), che applicata a
un reale calcola il valore assoluto e applicata a un complesso calcola il
modulo,
42 appunti di matlab
>> abs(-3)
ans =
3
>> abs(1+i)
ans =
1.4142
Il modo pi semplcie di scrivere un numero complesso quello di
sommare la parte reale a quella immaginaria moltiplicata per

1, che costruzione di numeri complessi:


complex()
in Matlab rappresentato equivalentemente dalle costanti predenite
i, j, 1i, 1j. Un altro modo usare la funzione complex(a,b). Per
assegnare z = a +ib si possono dunque usare le espressioni equivalenti
z = a + i
*
b;
z = a + j
*
b;
z = complex(a,b);
Loperazione inversa, cio lestrazione della parte reale e immaginaria
di un numero complesso si effettua con le funzioni real() e imag(), parte reale e immaginaria di un numero
complesso: real(), imag()
a = real(z);
b = imag(z);
I numeri complessi possono son in relazione biunivoca con i punti
del piano e quindi possono essere rappresentati usando le coordinate
polari nel piano di Gauss con modulo e fase (, ), la cui relazione con rappresentazione polare dei numeri com-
plessi: cart2pol(), pol2cart()
quella cartesiana deriva dal Teorema di Eulero,
z = a + ib = e
i
= cos() + i sin() (6)
da cui
a = cos(), b = sin() (7)
=
_
a
2
+ b
2
, = arctan(b/a) (8)
Per calcolare (a, b) da (, ) o vicevsersa, si usano le due funzioni
pol2cart() e cart2pol,
[a, b] = pol2cart(rho,theta);
[theta rho] = cart2pol(a,b);
Evidentemente luso di tali funzioni non limitato ai numeri complessi,
ma si estende alla conversione tra coordinate cartesiane e polari dei
punti del piano.
Successioni e serie numeriche
Le successioni sono funzioni dai numeri naturali ai reali. Dato un
numero naturale n 1, il valore della successione in genere indi-
cato come a
n
. spesso utile calcolare numericamente i valori della
capitolo 3 polinomi, numeri complessi, successioni e serie numeriche 43
successione in corrispondenza di un certo intervallo di naturali che
senza perdita di generalit si pu supporre del tipo [1, n]. In tal caso il
problema quindi il calcolo dei valori a
1
, a
2
, . . . , a
n
.
Dal momento che la successione specicata come una funzione
di un argomento intero, il suo calcolo pu essere fatto elemento per
elemento, calcolando a
i
per tutti i valori di i da 1 a n. Tuttavia, la
possibilit offerta da Matlab di calcolare funzioni su vettori, permette
di risolvere in modo pi semplice il problema utilizzando ununica
espressione che calcola tutti i valori a
1
, a
2
, . . . , a
n
contemporaneamente.
In tal caso, occorre prima denire un intervallo di valori interi con
la notazione v= 1:n. Il vettore v costiruisce il dominio su cui elementi
calcolare i valori della successione. Il calcolo si effettua applicando
la funzione che denisce la successione elemento per elemento, come
spiegato nella sezione Operazioni e funzioni sugli elementi di una matrice
nel Capitolo 2.
Esempio 12 Vericare numericamente che
lim
n
n sin

1
n

= 1 (9)
Fissato un valore massimo ragionevole per n, per esempio n
max
= 100, si
calcolano i valori della successione nellintervallo [1, n
max
].
>> nmax=1e2;
>> n=1:nmax;
>> a=n.
*
sin(1./n);
I primi 5 elementi della successione sono
>> a(1:5)
ans =
0.8415 0.9589 0.9816 0.9896 0.9933
Per vericare numericamente il limite, calcoliamo la differenza tra il valore
teorico e gli ultimi 5 elementi del vettore a,
>> 1-a(nmax-5:nmax)
ans =
1.0e-04
*
0.1847 0.1808 0.1771 0.1735 0.1700 0.1667
Lesempio illustra il modo di calcolare la funzione elemento per
elemento. Le operazioni .
*
e ./ sono necessarie proprio per applicare
la funzione a ogni elemento: 1./n il vettore che contiene i reciproci
degli elementi del vettore n, di ogni elemento di questo vettore viene
calcolato il seno e il vettore risultante viene moltiplicato elemento
per elemento con il vettore originale n per ottenere il vettore con gli
elementi della successione.
44 appunti di matlab
La visualizzazione e interpretazione dei risultati pi agevole in
forma graca. Nel prossimo capitolo si tratter della visualizzazione
graca dei valori di successioni e funzioni.
Una serie numerica denita da serie numeriche

i=1
a
i
(10)
dove a
i
una successione numerica. Problemi tipici che riguardano le
serie sono la determinazione della somma e del carattere della serie
(convergente o divergente).
Per il primo problema, una valutazione approssimata della somma
della serie si ottiene calcolando i primi n elementi della successione e
applicando loperazione sum() al vettore risultante. Il risultato ap-
prossimato, dato che il calcolo della somma della serie richiede ininiti
termini che ovviamente non possono essere calcolati. Naturalmente la
somma pi precisa quanti pi termini vengono considerati, ma oc-
corre anche cercare di determinare la velocit di convergenza della serie
al suo valore totale. Senza questa informazione difcile prevedere
lerrore compiuto approssimando la somma della serie con la somma
dei suoi primi n elementi.
Per stimare la velocit di convergenza, cos come per tentare di
rispondere numericamente al problema di determinare il carattere successione delle somme parziali:
cumsum()
della serie, conviene calcolare la successione delle somme parziali, cio
la successione
S
n
=
n

i=1
a
i
(11)
che associa a ogni intero n la somma dei primi n termini della suc-
cessione a
i
. La somma della serie lim
n
S
n
, e landamento di S
n
permette di farsi unidea della velocit di convergenza alla somma della
serie.
Per ricavare S
n
da a
i
si pu ricorrere al funzione cumsum(), che
applicata a un vettore v genera un vettore w il cui k-simo elemento la
somma dei primi k elementi di v. Ad esempio, cumsum([1 3 -5 4]) ha
come risultato [1 4 -1 3]. Il primo elemento di w uguale quindi al
primo elemento di v, mentre lultimo pari a sum(v).
Esempio 13 Dimostrare che serie geometrica

n=0
1
3
n
=
3
2
(12)
Calcoliamo i primi 12 elementi della successione a
n
=
1
3
n
:
>> n=0:12;
>> a=(1/3).^n
a =
capitolo 3 polinomi, numeri complessi, successioni e serie numeriche 45
Columns 1 through 7
1.0000 0.3333 0.1111 0.0370 0.0123 0.0041 0.0014
Columns 8 through 13
0.0005 0.0002 0.0001 0.0000 0.0000 0.0000
Si pu apprezzare che gli elementi di a
n
tendono rapidamente a 0 al crescere
di n. Una stima ragionevole della somma pu quindi essere basata su pochi
valori,
>> cumsum(a)
ans =
Columns 1 through 8
1.0000 1.3333 1.4444 1.4815 1.4938 1.4979 1.4993
Columns 9 through 13
1.4998 1.4999 1.5000 1.5000 1.5000 1.5000
Esempio 14 Vericare numericamente la divergenza della serie armonica serie armonica

n=1
1
n
(13)
In questo caso la verica diretta dei valori numerici delle somme parziali di
scarso aiuto. Per esempio, S
100
5.1874 e S
1000
7.4855. Tuttavia facile
vericare la seguente relazione che pu essere derivata dalla dimostrazione di
divergenza di Oresme,
2
k

n=1
1 +
k
2
(14)
>> k=2;
>> [sum(1./[1:2^k]) 1+k/2]
ans =
2.0833 2.0000
>> k=4;
>> [sum(1./[1:2^k]) 1+k/2]
ans =
3.3807 3.0000
>> k=6;
>> [sum(1./[1:2^k]) 1+k/2]
ans =
4.7439 4.0000
dalla quale facile dedurre che per k la successione delle somme paziali
illimitata.
Anche nel caso delle serie, la rappresentazione graca della succes-
sione delle somme parziali, che verr trattata nel prossimo capitolo,
di aiuto per stabilire il carattere della serie.
46 appunti di matlab
Successioni di prodotti
Una funzione analoga a cumsum() la funzione cumprod(). Se applicata
a un vettore v essa genera un vettore w il cui k-esimo elemento cumprod()
il prodotto dei primi k elementi di v. Evidentemente, se uno degli
elementi di v ha valore 0, gli elementi di w successivi a quella posizione
saranno nulli.
Esempio 15 La funzione fattoriale n! sui numeri naturali denita come
n! = 1 2 3 n =
n
i=1
i. (15)
Per calcolare il fattoriale di un insieme di interi, per esempio n = 4, 7, 12 si
pu procedere come segue.
>> f = cumprod([1:12]);
Il vettore f ha come elemento k-esimo il prodotto degli interi da 1 a k, ovvero
k!. I fattoriali desiderati sono dunque
>> f(4)
ans =
24
>> f(7)
ans =
5040
>> f(12)
ans =
479001600
Esercizi
Esercizio 1 Risolvere lequazione algebrica: x
5
5x
4
10x
3
+50x
2
+
9x 45 = 0. es. 1: le radici sono 5, 3, 1
Esercizio 2 Determinare il polinomio avente come radici i valori 2, 3/2,
-1, 0 e 4. Vericare che il valore del polinomio sia 0 nei punti richiesti.
Esercizio 3 Vericare che la seguente funzione razionale un polinomio
e determinarne le radici.
f (x) =
2x
5
+2x
4
+ x
3
+1
x
2
+ x +1
Esercizio 4 Dato il numero complesso z = 3 2i, determinare la
rappresentazione in forma polare z = e
i
di z
3
, e
z
e log(z).
capitolo 3 polinomi, numeri complessi, successioni e serie numeriche 47
Esercizio 5 Determinare per n [1, 20] i valori dei termini e delle
somme parziali delle serie

n=1
(1)
n
n

n=1
1
n log
2
(n +1)

n=1
e
1
n
1
1
n
Esercizio 6 Determinare per quale valore minimo n i termini delle
successioni dellesercizio precedente diventano denitivamente minori,
in valore assoluto, di e = 10
5
.
Esercizio 7 Confrontare nellintervallo [0, 3], discretizzato a intervalli
di ampiezza 0.5, i valori di f (x) = log(1 + x) e dei polinomi di Taylor
di grado 0, 1, 2, 3 di f (x) con punto di partenza x
0
= 1. es. 7: il polinomio di Tayor di f (x) di
grado 3 p
3
(x) = log(2) +
1
2
(x 1)
1
8
(x 1)
2
+
1
24
(x 1)
3
Bibliography
Patrick Marchand and Thomas O. Holland. Graphics and GUIs with
MATLAB. Chapman & Hall/CRC, third edition, 2003. ISBN 1-58488-
320-0.
Index
, 16
..., 13
, 22
( ), 15, 28
(:), 22
*
, 21
+, 21
,, 19
-, 21
., 22
.
*
, 22
./, 22
., 22
/, 21
1i, 16, 42
1j, 16, 42
:, 20, 31
;, 14, 15, 19
<=, 25
<, 25
==, 25
>=, 25
>, 25
Inf, 16
NaN, 16
[ ], 19, 32
&&, 25
&, 25
^, 22
~=, 25
, 25
abs(), 14, 41
all(), 25
any(), 25
cart2pol(), 42
ceil(), 17
complex(), 42
conv(), 40
cos(), 14
cumprod(), 46
cumsum(), 44
deconv(), 40
det(), 22
diag(), 22
end, 31
eps, 16
exp(), 14
expm(), 22
eye(), 20
factorial(), 14
find(), 33
fix(), 17
floor(), 17
imag(), 42
int2str(), 17
inv(), 22
i, 16, 42
j, 16, 42
length(), 20
log(), 14
log10(), 14
logm(), 22
max(), 24
mean(), 24
min(), 24
num2str(), 17
ones(), 20
pi, 16
plot(), 49
pol2cart(), 42
poly(), 41
polyder(), 40
polyval(), 39
polyvalm(), 39
rand(), 20
randn(), 20
rank(), 22
real(), 42
realmax, 16
realmin, 16
roots(), 40
round(), 17
sin(), 14
size(), 20
sqrt(), 14
sqrtm(), 22
std(), 24
str2double(), 17
str2num(), 17
sum(), 24
tan(), 14
trace(), 22
transpose(), 22
zeros(), 20
ans, 15
assegnamento, 15
autovalori, 22
calcolo del valore di un polinomio, 39
CF, 13
clc, 14
clear, 14
comandi utili, 14
conformit delle dimensioni, 19
confronto tra matrici e vettori, 25
connettori logici, 25
conversione di tipo, 17
coordinate cartesiane e polari nel piano,
42
costanti, 16
costruzione di polinomi con radici as-
segnate, 41
CW, 13
derivata di polinomi, 40
diary, 14
52 appunti di matlab
dichiarazioni di variabili, 16
dimensioni di matrici, 20
dimostrazione di Oresme, 45
dir, 14
divisione di polinomi, 40
divisione tra matrici, 21
editor, 13
eliminazione di righe e colonne, 32
espressioni, 14
estensione di matrici o vettori, 29
estrazione di elementi di una matrice,
30
estrazione di elementi di una matrice
in base a propriet , 34
estrazione di minori di una matrice, 30
fattoriale, 46
format compact, 14
funzioni matematiche di base, 15
funzioni matematiche su matrici, 22
funzioni su elementi di matrice, 22
funzioni su insiemi di valori, 23
funzioni su vettori, 42
graci, 49
graci nel piano, 49
GUI, 13
help, 14
history, 13
if, 27
indice unico per le matrici, 30
indici di matrici, 28
indici logici, 34
indici vettoriali, 30
intervalli, 20
intervalli di indici, 30
inversa di una matrice, 22
license, 4
massimo di un vettore o matrice, 24
matrici, 19
matrici booleane di selezione, 26
matrici e vettori booleani, 25
media, 24
minimo di un vettore o matrice, 24
notazione esponenziale, 16
numeri, 16
numeri complessi, 16, 39, 41
numeri immaginari, 16
numero di Nepero, 16
operatori logici aggregati, 25
operazioni aritmetiche, 15
operazioni aritmetiche su elementi di
matrice, 22
operazioni aritmetiche su matrici, 21
operazioni logiche, 25
parte intera, 17
piano di Gauss, 42
polinomi, 39
potenza, 14
prodotto di polinomi, 40
quanticatori logici, 25
radici di un polinomi, 40
rappresenataione cartesiana di numeri
complessi, 42
rappresentazione di numeri, 16
rappresentazione polare di numeri
complessi, 42
rappresentazioni grache di funzioni,
49
ricerca di indici di elementi che soddis-
fano una propriet , 33
scalari, 19
serie, 39
serie armonica, 45
serie geometrica, 44
serie numeriche, 42
soluzione di sistemi di equazioni lin-
eari, 21
somma e differenza di polinomi, 40
sommatoria, 24
stack, 30
stack di una matrice, 22
stringhe, 16, 17
successione dei prodotti parziali, 46
successione delle somme parziali, 44
successioni, 23, 39, 42
tabelle di valori numerici di funzioni,
23
teorema di Eulero, 42
tipi, 16
tipi di dati, 17
unit immaginaria, 16, 42
variabili, 16
vettori, 19
vettori di indici, 30
virgola mobile, 16, 17
while, 27
WS, 13
Universit` a Campus Bio-Medico di Roma
Facolt` a di Ingegneria
Dispense di
Programmazione in MATLAB
Febbraio 2007
Indice
1 Sottoprogrammi (bozze, v. 1.0) 4
1.1 Interfaccia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Chiamata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3 Polimorsmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4 Corpo dei sottoprogrammi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.5 Implementazione di sottoprogrammi polimor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.6 Organizzazione dei programmi in le . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.6.1 Regole di visibilit` a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.6.2 Organizzazione in un solo le . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.6.3 Organizzazione in pi ` u le . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.7 Variabili globali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2 Consultazione della documentazione (bozze, v. 1.0) 18
2.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2 Toolkit e impiego di sottoprogrammi di libreria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.3 Documentazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.3.1 Consultazione dal prompt dei comandi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.3.2 Consultazione da uninterfaccia graca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.3.3 Consultazione da un browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.4 Consigli utili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3 Applicazioni con interfaccia testuale (bozze, v. 1.0) 24
3.1 Input e output in MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.1.1 Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.1.2 Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.2 Un programma completo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4 Strutturazione dei programmi (bozze, v. 1.0) 30
4.1 Un esempio articolato . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.2 Discussione del problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.3 Decomposizione in sottoprogrammi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.4 Commenti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.5 Implementazione del sottoprogramma principale . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.6 Implementazione dei sottoprogrammi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.7 Implementazione di trova infinite soluzioni . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.8 Implementazione di elimina righe dipendenti . . . . . . . . . . . . . . . . . . . . . . . . . 40
1
Elenco delle gure
2.1 Linterfaccia graca per consultare la documentazione, come si presenta al suo avvio. . . . . . . . . . 22
2
Note introduttive
Queste dispense sono un tentativo di raccogliere in un documento unitario e coerente il materiale didattico messo a
punto per un corso di programmazione in MATLAB orientata allo sviluppo di applicazioni grache e interattive.
Nella loro forma attuale le dispense presentano ancora parti mancanti o lacunose. Tuttavia ` e stato fatto uno sforzo
per rendere omogenea la presentazione dei vari argomenti ed ` e pertanto opportuno segnalare al lettore i principali
accorgimenti impiegati per agevolare la loro assimilazione.
1. I termini impiegati per identicare i concetti via via introdotti sono sempre indicati in corsivo quando compaiono
per la prima volta. In alcuni casi tali termini sono riportati in corsivo anche nelle occorrenze successive quando
i concetti loro associati giocano un ruolo importante nel contesto di cui si tratta.
Si raccomanda pertanto al lettore di porre particolare cura nellassimilare i concetti associati a tali termini.
2. Il testo ` e frazionato in una parte principale, in osservazioni e in esempi. Le osservazioni possono essere omesse
in una prima lettura del testo, mentre gli esempi possono essere omessi nelle fasi di ripasso nali e sostituiti con
lo svolgimento di esercizi. Le osservazioni contribuiscono peraltro in modo sostanziale alla presentazione dei
vari argomenti e approfondiscono aspetti importanti o comunque utili allassimilazione dei concetti.
3. Anche le gure hanno un ruolo rilevante nella comprensione dei concetti tipici delle discipline informatiche, Si
raccomanda pertanto al lettore di fare particolare attenzione a quelle che illustrano caratteristiche strutturali dei
vari concetti presentati o che cercano di rendere in forma graca quelli tra essi che risultano pi` u astratti.
4. Si raccomanda inne di svolgere gli esercizi riportati alla ne dei paragra a breve distanza dalla lettura del
testo. Essi, grazie anche alla loro ripetitivit` a, hanno lo scopo di aiutare lassimilazione dei concetti e di mettere
in evidenza possibili difcolt` a nascoste dietro unapparente semplicit` a.
Il testo ha comunque natura provvisoria e contiene inevitabilmente imprecisioni ed errori. Lautore ` e grato di
qualsiasi commento o segnalazione di errore che i lettori vogliano inviare. Per rendere tali segnalazioni pi` u efcaci si
raccomanda di redigerle in forma sintetica e puntuale facendo riferimento alla versione delle bozze (riportata in altro su
ogni pagina), al capitolo, al numero di pagina e alla riga allinterno della pagina. Inviare le segnalazioni allindirizzo di
posta elettronica g.iannello@unicampus.it indicando sempre come subject: SEGNALAZIONE DISPENSE
LABINF2.
3
Capitolo 1
Sottoprogrammi (bozze, v. 1.0)
1.1 Interfaccia
Come ` e noto, limpiego dei sottoprogrammi richiede lintroduzione del concetto di interfaccia di un sottoprogramma.
Con tale termine si indica linsieme di informazioni che occorre conoscere sia per usare il sottoprogramma, sia per
implementarlo, e cio` e per codicare lalgoritmo che esso rappresenta.
Da un punto di vista pratico linterfaccia di un sottoprogramma viene descritta attraverso due componenti:
un prototipo, che ` e una frase del linguaggio di programmazione che include le seguenti informazioni:
il nome del sottoprogramma;
lelenco dei parametri di ingresso e di uscita;
una descrizione completa del compito che il sottoprogramma svolge, incluso il signicato dei parametri; tale
descrizione, per poter descrivere con accuratezza cosa fa il sottoprograma, ` e normalmente fornita attraverso un
commento contenente frasi in linguaggio naturale o altra notazione non necessariamente prevista dal linguaggio
usato.
In MATLAB il prototipo assume la seguente forma:
function [ parametri formali di uscita ] = nome ( parametri formali di ingresso )
dove:
parametri formali di uscita ` e una lista di identicatori separati da virgole che corrispondono ai parametri di
uscita del sottoprogramma;
nome ` e un identicatore che corrisponde al nome del sottoprogramma;
parametri formali di ingresso ` e una lista di identicatori separati da virgole che corrispondono ai parametri di
ingresso del sottoprogramma.
Si noti che, come ` e usuale in MATLAB, i parametri non sono univocamente associati a un tipo, ma hanno una
natura polimorfa e assumono di volta in volta il tipo richiesto dal contesto di esecuzione (vedi anche paragrafo 1.3).
Osservazione 1.1
Se il sottoprogramma non ha parametri di uscita il prototipo assume la forma:
4
CAPITOLO 1. SOTTOPROGRAMMI (BOZZE, V. 1.0) 5
function nome ( parametri formali di ingresso )
Se viceversa il sottoprogramma non ha parametri di ingresso il prototipo assume la forma:
function [ parametri formali di uscita ] = nome
Se il sottoprogramma ha un solo parametro di uscita le parentesi quadre possono essere omesse.
Esempio 1.1
Linterfaccia:
function X = roots ( C )
%
% Descrizione:
% restituisce in un vettore colonna le radici del polinomio che ha
% per coefficienti gli elementi di C (C(1) e il coefficiente del
% termine di ordine maggiore)
denisce un sottoprogramma che accetta un array C di N valori e restituisce un array contenente le N 1 radici del
polinomio di ordine N 1 che ha gli elementi di C come coefcienti.
Esempio 1.2
Linterfaccia:
function U = union ( A, B )
%
% Descrizione:
% restituisce nel vettore U gli elementi presenti in almeno uno dei
% due vettori A e B
denisce un sottoprogramma che accetta due vettori A e B, e restituisce gli elementi presenti in almeno uno di essi
1
.
Esempio 1.3
Linterfaccia:
function I = intersect ( A, B )
%
% Descrizione:
% restituisce nel vettore I gli elementi presenti sia nel vettore A
% che nel vettore B
denisce un sottoprogramma che accetta due vettori A e B, e restituisce gli elementi presenti in entrambi.
Esempio 1.4
Linterfaccia:
1
Per ragioni didattiche, sia questo esempio che i successivi presentano uninterfaccia non completa dei rispettivi sottoprogrammi che in realt` a
sono polimor (cfr. successivo paragrafo 1.3).
CAPITOLO 1. SOTTOPROGRAMMI (BOZZE, V. 1.0) 6
function [ U, I ] = set_combine ( A, B )
%
% Descrizione:
% restituiscen in U i valori presenti nel vettore A o nel vettore B,
% in I i valori presenti nel vettore A e nel vettore B
denisce un sottoprogramma che accetta due array monodimensionali e restituisce due array anche essi monodimen-
sionali. Il primo contiene i valori contenuti in almeno uno dei due array passati in ingresso (senza ripetizioni), il
secondo contiene i valori contenuti in entrambi gli array passati in ingresso.
Esempio 1.5
Linterfaccia:
function S = sum ( A )
%
% Descrizione:
% se A `e un array a N dimensioni (N>1), restituisce larray S a N-1
% dimensioni contenente le somme degli elementi di A lungo la prima
% dimensione che ha estensione maggiore di 1
denisce un sottoprogramma che somma gli elementi di un array lungo una delle sue dimensioni. Ad esempio, se
larray A contenesse il vettore riga:
4 1 -2 7 0
il sottoprogramma sum restituirebbe 10, cio` e uno scalare pari alla somma degli elementi del vettore. Se invece A
contenesse la matrice bidimensionale:
1 0 1 3 -4 0
3 -1 4 0 0 1
5 6 -3 0 1 6
il sottoprogramma sum restituirebbe il vettore riga:
9 5 2 3 -3 7
contenente le somme degli elementi delle colonne di A.
Rinviando una spiegazione pi ` u dettagliata dellinterfaccia del sottoprogramma, lesempio ` e qui proposto per met-
tere in evidenza la natura polimorfa dei sottoprogrammi MATLAB: il tipo dei parametri non ` e denito a priori, ma
dipende da quello dei parametri effettivi. In particolare, in questo caso, il tipo del parametro di uscita (tipo base e
numero delle dimensioni) dipende dal tipo del parametro di ingresso.
1.2 Chiamata
Lesecuzione di un sottoprogramma MATLAB si ottiene mediante una chiamata al sottoprogramma. Una chiamata ha
la forma:
[ parametri effettivi di uscita ] = nome ( parametri effettivi di ingresso )
dove:
CAPITOLO 1. SOTTOPROGRAMMI (BOZZE, V. 1.0) 7
parametri effettivi di uscita ` e una lista di identicatori separati da virgole che corrispondono ai parametri effettivi
di uscita del sottoprogramma, cio` e alle variabili a cui verranno assegnati i valori prodotti dal sottoprogramma;
nome ` e un identicatore che corrisponde al nome del sottoprogramma;
parametri effettivi di ingresso ` e una lista di espressioni separate da virgole che corrispondono ai parametri
effettivi di ingresso del sottoprogramma, cio` e ai valori che verranno passati al sottoprogramma prima che inizi
la sua esecuzione.
Come nel caso dei prototipi, se il sottoprogramma ha un solo parametro di uscita si possono omettere le parentesi
quadre. Nel caso poi non vi fosse alcun parametro di uscita la chiamata assumerebbe la forma:
nome ( parametri effettivi di ingresso )
e i valori restituiti dal sottoprogramma vengono assegnati per default alla variabile ans. Analogamente, se non vi
fossero parametri di ingresso la chiamata avrebbe la forma:
[ parametri effettivi di uscita ] = nome
Esempio 1.6
Con riferimento agli esempi del paragrafo 1.1, listruzione:
X = roots( [ 1 -5 4 ] );
rappresenta una chiamata al sottoprogramma roots e produce lassegnazione a X dellarray:
4
1
che sono le radici del polinomio di secondo grado: x
2
5x + 4.
Listruzione:
[ U, I ] = set_combine( [ 3 1 0 ], [ 6 8 3 1 ] );
rappresenta una chiamata al sottoprogramma set combine e produce lassegnazione a U ed I rispettivamente degli
array [ 0 1 3 6 8 ] e [ 1 3 ].
1.3 Polimorsmo
In MATLAB i sottoprogrammi hanno una natura polimorfa, nel senso che il nome del sottoprogramma non identica
in modo univoco n e il numero e la natura dei parametri, n e la funzionalit` a del sottoprogramma, ma tali caratteristiche
dipendono dal contesto in cui viene effettuata la chiamata. Una trattazione esaustiva dellargomento ` e tuttavia estre-
mamente complessa ed esula dagli obiettivi di queste dispense. Ci limiteremo a illustrare le forme di polimorsmo pi` u
frequenti e di maggiore utilit` a pratica.
La prima forma di polimorsmo riguarda il tipo dei parametri del sottoprogramma. In generale i parametri formali
di ingresso assumono il tipo dei corrispondenti parametri effettivi. Ad esempio, con riferimento allesempio 1.5, se la
variabile M ` e una matrice 4 3 di tipo base uint8, nella chiamata:
S_cols = sum(M);
il parametro formale A del sottoprogramma ` e pure una matrice 4 3 di tipo base uint8, mentre nella chiamata:
SOMMA = sum( [ 5.3 -8.002 54.907 0.00045 -7.689 ] );
CAPITOLO 1. SOTTOPROGRAMMI (BOZZE, V. 1.0) 8
il parametro formale A del sottoprogramma ` e un vettore riga di 5 elementi di tipo double.
Si noti anche che a un diverso tipo dei parametri di ingresso pu` o corrispondere una funzionalit` a diversa del sot-
toprogramma. Ad esempio, nel caso del sottoprogramma sum, se largomento ` e un vettore riga o colonna (cio` e
` e monodimensionale), viene restituito un unico valore che ` e la somma di tutti gli elementi dellargomento, mentre
se largomento ` e un array pluridimensionale viene restituito un array di valori di dimensione opportuna (con una
dimensione in meno).
Una seconda analoga forma di polimorsmo riguarda il tipo dei parametri di uscita che viene determinato dal tipo
dei corrispondenti risultati calcolati dal sottoprogramma. Per esempi di questo tipo di polimorsmo si rinvia il lettore
al successivo paragrafo 1.4 dove viene illustrato come implementare i sottoprogrammi in MATLAB.
Una terza forma di polimorsmo riguarda il numero dei parametri di ingresso o di uscita. In altre parole lo
stesso nome di sottoprogramma pu` o essere usato passando un numero variabile di parametri di ingresso e/o di uscita.
Normalmente, variando il numero di parametri, cambia la funzionalit` a del sottoprogramma, a volte anche radicalmente.
Esempio 1.7
Un esempio molto evidente di questo tipo di polimorsmo ` e dato dal sottoprogramma min (e dallanalogo sottopro-
gramma max) che pu` o avere una molteplicit` a di interfacce elencate di seguito:
function M = min ( A )
%
% Descrizione:
% se A `e un array a N dimensioni (N>1), restituisce larray M a N-1
% dimensioni contenente il minimo degli elementi di A lungo la prima
% dimensione di A che ha estensione maggiore di 1
function [ M, I ] = min ( A )
%
% Descrizione:
% se A `e un array a N dimensioni (N>1), restituisce:
% M: array a N-1 dimensioni contenente il minimo degli elementi di
% A lungo la prima dimensione di A che ha estensione maggiore di 1
% I: array a N-1 dimensioni contenente gli indici degli elementi che
% contengono i minimi selezionati lungo la prima dimensione di A
% che ha estensione maggiore di 1; se vi sono piu valori minimi
% uguali lungo tale dimensione, vengono restituiti gli indici dei
% primi incontrati
function M = min ( A, B )
%
% Descrizione:
% se A e B sono array di a N dimensioni di uguale estensione,
% restituisce larray M ad N dimensioni contenente il valore
% minimo tra quello degli elementi omologhi di A e B
function M = min ( A, B, dim )
%
% Descrizione:
% se A `e un array a N dimensioni (N>1) e B `e [] (array vuoto),
% restituisce larray M a N-1 dimensioni contenente il minimo degli
% elementi di A lungo la sua dim-esima dimensione
CAPITOLO 1. SOTTOPROGRAMMI (BOZZE, V. 1.0) 9
function [ M, I ] = min ( A, B, dim )
%
% Descrizione:
% se A `e un array a N dimensioni (N>1) e B `e [] (array vuoto),
% restituisce:
% M: array a N-1 dimensioni contenente il minimo degli elementi di
% A lungo la dim-esima dimensione di A
% I: array a N-1 dimensioni contenente gli indici degli elementi che
% contengono i minimi selezionati lungo la dim-esima dimensione di
% A che ha estensione maggiore di 1; se vi sono piu valori minimi
% uguali lungo tale dimensione, vengono restituiti gli indici dei
% primi
Esempio 1.8
Per comprendere la natura polimorfa del sottoprogramma min si considerino i seguenti esempi di chiamata del
sottoprogramma accompagnati dallillustrazione dei corrispondenti risultati.
Se da riga di comando si digita:
min ( [ 2 3; 4 1; 0 5 ] )
linterprete MATLAB riconoscer` a dal contesto che si desidera invocare il sottoprogramma nella sua prima forma (un
solo parametro di ingresso e un solo parametro di uscita) e visualizzer` a:
ans =
0 1
Se invece si digita:
min ( [ 2 3; 4 1; 0 5 ], [ 4 8; 1 1; 1 2 ] )
linterprete MATLAB riconoscer` a dal contesto che si desidera invocare il sottoprogramma nella sua terza forma (due
parametri di ingresso di uguali dimensioni e di uguale estensione e un solo parametro di uscita) e visualizzer` a:
ans =
2 3
1 1
0 2
Ancora, se si digita:
[m,inds] = min ( [ 2 3; 4 1; 0 5 ] )
linterprete MATLAB riconoscer` a dal contesto che si desidera invocare il sottoprogramma nella sua seconda forma
(un solo parametro di ingresso e due parametri di uscita) e visualizzer` a:
m =
0 1
CAPITOLO 1. SOTTOPROGRAMMI (BOZZE, V. 1.0) 10
inds =
3 2
Se si digita:
m = min ( [ 2 3; 4 1; 0 5 ], [], 2 )
linterprete MATLAB riconoscer` a dal contesto che si desidera invocare il sottoprogramma nella sua quarta forma (tre
parametri di ingresso e un parametro di uscita) e visualizzer` a:
m =
2
1
0
Inne, se si digita:
[m,inds] = min ( [ 2 3; 4 1; 0 5 ], [], 2 )
linterprete MATLAB riconoscer` a dal contesto che si desidera invocare il sottoprogramma nella sua quinta forma (tre
parametri di ingresso e due parametri di uscita) e visualizzer` a:
m =
2
1
0
inds =
1
2
1
Osservazione 1.2
Lillustrazione della natura polimorfa del sottoprogramma min appena discussa ` e una rielaborazione di quanto conte-
nuto nella documentazione tecnica di MATLAB. In realt` a, infatti, interrogando lhelp in linea di MATLAB (digitando
help min al prompt di comandi dellinterprete) si ottiene la seguente descrizione:
MIN Smallest component.
For vectors, MIN(X) is the smallest element in X. For matrices,
MIN(X) is a row vector containing the minimum element from each
column. For N-D arrays, MIN(X) operates along the first
non-singleton dimension.
[Y,I] = MIN(X) returns the indices of the minimum values in vector I.
CAPITOLO 1. SOTTOPROGRAMMI (BOZZE, V. 1.0) 11
If the values along the first non-singleton dimension contain more
than one minimal element, the index of the first one is returned.
MIN(X,Y) returns an array the same size as X and Y with the
smallest elements taken from X or Y. Either one can be a scalar.
[Y,I] = MIN(X,[],DIM) operates along the dimension DIM.
When complex, the magnitude MIN(ABS(X)) is used. NaNs are ignored
when computing the minimum.
Example: If X = [2 8 4 then min(X,[],1) is [2 3 4],
7 3 9]
min(X,[],2) is [2 and min(X,5) is [2 5 4
3], 5 3 5].
See also MAX, MEDIAN, MEAN, SORT.
Tale descrizione fornisce informazioni equivalenti alle interfacce riportate in precedenza, anche se in una forma
meno chiara e strutturata.
Questo modo di descrivere le funzionalit` a dei sottoprogrammi gi` a implementati in MATLAB ` e tipico e comune a
molti altri sottoprogrammi. Al contrario di quanto si trova nellhelp in linea e nelle guide di riferimento, gli esempi
impiegati nel seguito per spiegare i vari concetti impiegano sempre uno stile di redazione delle interfaccie unifor-
me e molto dettagliato, sul tipo di quello presentato precedentemente. Questa scelta, oltre che da evidenti ragioni
di chiarezza didattica, ` e motivata dalla convinzione che insegnare a redigere la descrizione delle funzionalit` a di un
sottoprogramma in modo chiaro e ordinato sia di fondamentlae importanza per impostare correttamente anche la sua
implementazione.
1.4 Corpo dei sottoprogrammi
Se lutente vuole implementare un nuovo sottoprogramma, deve prima di tutto denirne linterfaccia per poi passare ad
implementare lalgoritmo che svolge il compito specicato dalla descrizione, usando il linguaggio di programmazione
di MATLAB.
Sul piano linguistico, il sottoprogramma consiste semplicemente nel prototipo seguito dalla formulazione in MA-
TLAB dellalgoritmo, che prende il nome di corpo del sottoprogramma, e dallistruzione nale return che indica la
ne del corpo.
Esempio 1.9
Ad esempio, limplementazione del sottoprogramma set combine (cfr. esempi 1.2, 1.3 e 1.4) ` e la seguente:
function [ U, I ] = set_combine ( A, B )
% Sintassi:
% [ U, I ] = set_combine ( A, B )
%
% Descrizione:
% [ U, I ] = set_combine ( A, B ): restituisce
CAPITOLO 1. SOTTOPROGRAMMI (BOZZE, V. 1.0) 12
% in U i valori presenti nei due vettori A o in B,
% in I i valori presenti nei due vettori A e in B
U = union(A,B);
I = intersect(A,B);
return
Nel corpo del sottoprogramma, il codice pu` o usare i parametri formali di ingresso che, allinizio dellesecuzione del
sottoprogramma, vengono inizializzati con i valori dei corrispondenti parametri effettivi. Il meccanismo di passaggio
dei parametri usato per i parametri di ingresso ` e pertanto quello per valore e dunque i corrispondenti parametri effettivi
sono sempre delle espressioni.
Esempio 1.10
Con riferimento allesempio 1.9, il codice:
X = [ 1 2 3 ];
Y = [ 3 4 ];
[Z, T] = set_combine(X,Y);
causa la chiamata del sottoprogramma set combine, linizializzazione del parametro formale A con il valore della
variabile X, linizializzazione del parametro formale B con il valore della variabile Y, lesecuzione del corpo (che a
sua volta provoca la chiamata dei sottoprogrammi union e intersect usando A e B come parametri effettivi di
ingresso).
Nel corpo del sottoprogramma, il codice pu` o denire i parametri formali di uscita che, allinizio dellesecuzione del
sottoprogramma risultano indeniti. La denizione dei parametri formali di uscita produce la contestuale denizione
dei corrispondenti parametri effettivi, che assumono pertanto lo stesso valore e lo stesso tipo dei parametri formali
loro associati. Il meccanismo di passaggio dei parametri usato per i parametri di uscita ` e pertanto analogo a quello per
riferimento e quindi eventuali assegnazioni sui parametri formali di uscita nel corpo del sottoprogramma si traducono
sempre in assegnazioni sui corrispondenti parametri effettivi, che sono sempre delle variabili.
Esempio 1.11
Con riferimento allesempio 1.9, il codice:
X = [ 1 2 3 ];
Y = [ 3 4 ];
[Z, T] = set_combine(X,Y);
causa lassegnazione alla variabile Z del risultato della chiamata a union e alla variabile T del risultato della chiamata
a intersect, presenti nel corpo del sottoprogramma set combine. A motivo di tale assegnazione le variabili Z
e T assumono il tipo di tali risultati, in modo analogo a come i parametri formali di ingresso assumono il tipo dei
corrispondenti parametri effettivi.
`
E questo un tipico esempio di polimorsmo (cfr. paragrafo 1.3).
Osservazione 1.3
Nellesempio 1.9, oltre al prototipo sono stati inclusi nellimplementazione del sottoprogramma anche i commenti
contenenti la descrizione delle sue funzionalit` a. Sebbene non sia strettamente necessario procedere in questo modo (i
commenti possono sempre essere omessi in quanto non signicativi ai ni dellesecuzione), ` e per` o sempre opportuno,
CAPITOLO 1. SOTTOPROGRAMMI (BOZZE, V. 1.0) 13
perch e lutilizzo dei sottoprogrammi ` e pi` u difcoltoso e maggiormente soggetto a errori quando la descrizione non
` e esplicitamente presente. Si noti che i commenti inclusi nellimplementazione prima dellinizio delle istruzioni del
sottoprogramma sono trattati dallambiente di esecuzione come documentazione tecnica. A tal proposito si veda il
capitolo 2.
Osservazione 1.4
Anche la frase return al termine del corpo pu` o essere omessa, in quanto essa ` e comunque sottintesa. Tuttavia, anche
in questo caso, ` e opportuno non omettere tale frase perch` e essa facilita lidenticazione del corpo del sottoprogramma
quando sono presenti pi ` u sottoprogrammi nello stesso le (vedi paragrafo 1.6).
A parte i parametri di ingresso e di uscita, nel corpo di un sottoprogramma possono comparire altre variabili.
Tali variabili sono sempre variabili locali. Con questo termine si vuole indicare che esse esistono solo durante
lesecuzione del sottoprogramma stesso, e cio` e da quando vengono create a seguito dellesecuzione di una qualche
istruzione del corpo del sottoprogramma, a quando il sottoprogramma termina.
Non ` e quindi possibile fare riferimento nel corpo di un sottoprogramma a variabili create da altri sottoprogrammi,
da script o da comandi singoli. In particolare, se prima della chiamata a un sottoprogramma nellambiente di esecu-
zione esiste una variabile A, essa non pu` o essere usata o denita nel corpo del sottoprogramma, e se in esso compare
unistruzione che usa o denisce una variabile di nome A, questultima ` e una nuova variabile locale che, come sempre
deve essere creata e denita prima di poter essere usata.
Osservazione 1.5
I parametri formali di ingresso si comportano come normali variabili locali che vengono automaticamente create e
inizializzate con i valori dei corrispondenti parametri effettivi al momento della chiamata. Come ovvia consequenza
si ha che eventuali assegnazioni sui parametri formali di ingresso nel corpo del sottoprogramma non hanno effetto sui
corrispondenti parametri effettivi.
Osservazione 1.6
I parametri formali di uscita non si comportano come normali variabili locali, in quanto, da un lato vengono automati-
camente create al momento della chiamata con un valore indenito che non ne consente luso prima di ricevere esplici-
tamente un valore, e dallaltro, ogni qual volta vengono denite, esse trasferiscono il valore ricevuto al corrispondente
parametro effettivo.
Osservazione 1.7
Per quanto detto, il modello di esecuzione dei sottoprogrammi in MATLAB prevede che al momento della chiamata
di un sottoprogramma vengano eseguiti i seguenti passi:
1. lambiente di esecuzione del chiamante (cio e il suo workspace) viene congelato;
2. viene creato un nuovo ambiente inizialmente vuoto in cui verr` a eseguito il sottoprogramma;
3. vengono creati i parametri formali di ingresso come variabili del nuovo ambiente inizializzate con il valore dei
corrispondenti paramtri effettivi di ingresso;
4. vengono creati i parametri formali di uscita, inizialmente indeniti e associati ai parametri effettivi di uscita in
modo che ogni assegnazione sui parametri formali di uscita allinterno dei sottoprogrammi abbiano effetto sui
corrispondenti parametri effettivi di uscita;
5. viene eseguito in questo nuovo ambiente il corpo del sottoprogramma;
CAPITOLO 1. SOTTOPROGRAMMI (BOZZE, V. 1.0) 14
6. se tale esecuzione prevede la creazione di nuove variabili esse vengono create nellambiente di esecusione creato
allavvio del sottoprogramma;
7. quando il corpo del sottoprogramma termina la sua esecuzione perch e si incontra una frase return o perch e
termina la sequenza di istruzioni che lo compone, lintero ambiente locale del sottoprogramma viene eliminato
dal sistema;
8. lambiente di esecuzione del chiamante che era stato congelato viene pienamente ripristinato e lesecuzione del
chiamante riprende dallistruzione successiva;
9. i valori restituiti dal sottoprogramma attraverso i suoi paramtri formali di uscita sono presenti nelle varia-
bili del chiamante che sono state passate come parametri effettivi di uscita al momento della chiamata al
sottoprogramma.
1.5 Implementazione di sottoprogrammi polimor
Come detto nel paragrafo 1.3, una forma di polimorsmo dei sottoprogrammi riguarda il numero dei parametri di
ingresso o di uscita. In corrispondenza dello stesso nome di sottoprogramma possono cio` e essere usati un nume-
ro variabile di parametri di ingresso e/o di uscita. In questo paragrafo mostriamo come ` e possibile implementare
sottoprogrammi polimor con un numero varibile di parametri.
Nel corpo di un qualsiasi sottoprogramma possono essere richiamate due sottoprogrammi predeniti denominati
nargin e nargout, che restituiscono, rispettivamente, il numero di parametri effettivi di ingresso e il numero
di parametri effettivi di uscita forniti nella chiamata. In altre parole, se nella chiamata a un sottoprogramma vengono
specicati 3 parametri effettivi di uscita e 2 parametri effettivi di ingresso, nel corpo del sottoprogramma, una chiamata
a nargin restituit` a il valore 2 e una chiamata al nargout restituir` a il valore 3.
Questo signica quindi che, a seconda del numero di argomenti, ` e possibile implementare funzionalit` a diverse
nello stesso sottoprogramma. Durante la sua esecuzione, un test di tipo selettivo permetter` a di decidere quale eseguire.
Esempio 1.12
Nel seguito si riporta limplementazione polimorfa di una funzione che restituisce la rappresentazione di un numero
intero in una base assegnata. La rappresentazione restituita dal sottoprogramma ` e una stringa di cifre nella base
specicata. Il valore della base ` e opzionale e va preceduto da un parametro di tipo stringa che deve essere uguale al
valore costante base. Se tale parametro e il successivo valore della base vengono omessi, si assume per default la
base 10.
La funzione ` e organizzata in un solo le. Al suo inizio si trova il sottoprogramma rappresenta numero, che
gestisce il polimorsmo. A seconda del numero di parametri di input, viene chiamato unulteriore sottoprogramma
non polimorfo, rappresentazione base n, che implementa un algoritmo indipendente dalla base specicata.
Si noti che il secondo sottoprogramma, poich` e non ha lo stesso nome del le .m pu` o essere chiamato solo dal primo
sottoprogramma presente nel le.
function rappresentazione = rappresenta_numero ( num, opt, b )
%
% Sintassi:
% rappresentazione = rappresenta_numero ( num )
%
% Descrizione:
% restituisce la stringa di caratteri corrispondente alla rappresentazione
% di num in base 10.
%
CAPITOLO 1. SOTTOPROGRAMMI (BOZZE, V. 1.0) 15
% Sintassi:
% rappresentazione = rappresenta_numero ( num, base, b )
%
% Descrizione:
% restituisce la stringa di caratteri corrispondente alla rappresentazione
% di num nella base b, indicata dopo la stringa base; b puo essere al massimo 36
% e vengono usate le lettere maiuscole dellalfabeto inglese per rappresentare le
% cifre da 10 a 35
if nargin == 1
rappresentazione = rappr_base_n(num, 10);
elseif nargin == 2
error( [ numero errato di parametri di input ....
-- consultare la documentazione ] )
elseif nargin == 3
if strcmp(opt,base)
rappresentazione = rappr_base_n(numero, b);
else
error( opzione non prevista );
end
else
error( [ numero errato di parametri di input ....
-- consultare la documentazione ] )
end
return
%--------------------------------------------------------------------------
function rappr = rappr_base_n ( num, b )
%
% Descrizione:
% restituisce la rappresentazione di num in base b (2<=b<=36)
i = 0;
if num == 0
rappr = 0;
else
while num = 0
i = i+1;
resto = mod(num,b);
if resto<9 % la rappresentazione e una cifra decimale
rappr(i) = char(resto+48);
else % la rappresentazione e una lettera
rappr(i) = char((resto-10)+65);
end
num = floor(num/b);
end
CAPITOLO 1. SOTTOPROGRAMMI (BOZZE, V. 1.0) 16
rappr = fliplr(rappr); % inverte lordine delle cifre
end
return
1.6 Organizzazione dei programmi in le
Lintroduzione dei sottoprogrammi consente di suddividere uno script complesso in pi` u parti, ciascuna con una funzio-
nalit` a ben denita e parametrizzata. Ci` o consente il riutilizzo del codice quando una specica funzionalit` a ` e richiesta
pi ` u volte allinterno di uno stesso script.
Rinviando una trattazione pi` u sistematica dei principi che devono governare la denizione di sottoprogrammi con
elevate caratteristiche di qualit` a al capitolo 2, illustriamo in questo paragrafo le regole di redazione di programmi
articolati in pi` u sottoprogrammi.
Nel seguito con il termine programma principale di un programma indicheremo il segmento di codice da cui deve
partire lesecuzione del programma
2
. Un programma principale pu` o essere uno script o un sottoprogramma a seconda
dei casi.
1.6.1 Regole di visibilit` a
Nella redazione di programmi costituiti da pi` u sottoprogrammi ` e necessario rispettare le seguenti regole di redazione:
uno script non pu` o contenere sottoprogrammi;
un sottoprogramma pu` o essere chiamato sempre, se la sua implementazione ` e stata collocata allinizio di
un le con sufsso .m, con lo stesso nome del sottoprogramma e che si trova in una directory accessibile
allinterprete
3
;
altrimenti un sottoprogramma pu` o essere chiamato solo da un sottoprogramma incluso nello stesso le.
In altre parole un sottoprogramma scritto allinizio di un le con lo stesso nome ` e sempre visibile, mentre in caso
contrario esso ` e visibile solo dagli altri sottoprogrammi contenuti nello stesso le. Per questo motivo queste regole di
chiamata vengono anche dette regole di visibilit` a.
1.6.2 Organizzazione in un solo le
Poich` e uno script non pu` o contenere sottoprogrammi, se si sceglie di organizzare un programma che comprende dei
sottoprogrammi in un solo le ` e necessario che il programma principale sia implementato come sottoprogramma e
compaia allinizio dellunico le che compone il programma.
Poich` e per denizione tutti i sottoprogrammi che compongono il programma sono contenuti nello stesso le, per
le regole di visibilit` a essi possono chiamarsi lun laltro senza limitazioni.
1.6.3 Organizzazione in pi ` u le
Se si sceglie di organizzare un programma che comprende dei sottoprogrammi in pi ` u le, sono possibili vari approcci:
1. includere un solo sottoprogramma in ciascun le;
2
La nozione di programma principale ` e presente in tutti i linguaggi di programmazione. Ad esempio nel linguaggio C, il programma principale
` e il sottoprogramma che assume il nome predenito main.
3
Linterprete ha accesso a un insieme di directory di default che dipendono dallistallazione e che possono essere visualizzate col comando
path. Lo stesso comando pu` o essere usato per modicare la lista delle directory di default (cfr. help in linea per i dettagli).
CAPITOLO 1. SOTTOPROGRAMMI (BOZZE, V. 1.0) 17
2. includere pi ` u sottoprogrammi in ciascun le.
In entrambi i casi valgono le regole di visibilit` a illustrate in precedenza. In particolare, nel caso 1, ciascun le deve
avere lo stesso nome del sottoprogramma in esso contenuto e il programma principale pu` o essere sia uno script che
un sottoprogramma. Nel caso 2, ciascun le deve avere lo stesso nome del primo sottoprogramma in esso contenuto
e i sottoprogrammi che non compaiono per primi nei rispettivi le possono essere chiamati esclusivamente dagli altri
sottoprogrammi presenti nel le. Anche in questo caso il programma principale pu` o essere sia uno script che un
sottoprogramma.
1.7 Variabili globali
Per passare informazioni da un sottoprogramma allaltro, vengono utilizzati principalmentei parametri di scambio. I
parametri di ingresso servono per comunicare le informazioni di partenza dal chiamante al chiamato allinizio delle-
secuzione di questultimo. I parametri di uscita servono per comunicare i risultati dal chiamato al chiamante in modo
che essi siano disponibili per successive elaborazioni quando il sottoprogramma termina la sua esecuzione.
Tutte le variabili usate da un sottoprogramma hanno validit` a esclusivamente durante lesecuzione del sottopro-
gramma stesso e il loro contenuto viene perduto quando il sottoprogramma termina la sua esecuzione. Si noti che
questo ` e vero anche per i parametri di uscita perch e se ` e vero che la loro modica ha effetto sui corrispondenti para-
metri effettivi, ` e per` o anche vero che nelle successive chiamate del sottoprogramma essi risultano sempre inizialmente
indeniti e non possono essere usati prima di essere nuovamente deniti.
`
E per` o possibile introdurre delle variabili globali, che cio` e risultano potenzialmente visibili da tutti i sottoprogram-
mi, purch` e essi le dichiarino esplicitamente. La variabili globali devono essere dichiarate con la frase:
global lista di variabili
dove lista di variabili ` e la lista degli identicatori delle variabili che si vogliono introdurre come globali separati da
virgola.
Quando una variabile globale viene creata (per esempio assegnadogli un valore), essa conserva lultimo valo-
re assegnatogli anche dopo che il sottoprogramma che le ha assegnato tale valore termina. Se pi ` u sottoprogrammi
dichiarano lo stesso identicatore in una frase global esso identica sempre la stessa variabile e dunque se un sot-
toprogramma le assegna un valore, qualunque altro sottoprogramma che la dichiara ritrova in essa tale valore se nel
frattempo essa non ` e stata ridenita.
Capitolo 2
Consultazione della documentazione (bozze,
v. 1.0)
2.1 Introduzione
In generale, la consultazione della documentazione ` e di grande aiuto nella programmazione, perch e rende possibile
accedere ad un insieme di utili informazioni, come la sintassi di una particolare funzione, esempi, demo, etc.
Nel seguito verranno prima illustrate le modalit` a principali per accedere a tale materiale, e poi saranno forniti
alcuni riferimenti utili ai quali ricorrere quando, ad esempio, la documentazione non sia sufciente, si cerchino degli
approfondimenti o funzioni/tool gratuiti adatti o adattabili al problema da risolvere.
2.2 Toolkit e impiego di sottoprogrammi di libreria
Lambiente MATLAB include un ampio insieme di sottoprogrammi cosiddetti di utilit` a per la manipolazione di array,
di stringhe, per le operazioni di ingresso e uscita, ecc. Prima di sviluppare unapplicazione ` e pertanto opportuno
consultare la documentazione disponibile per vercare se siano gi` a disponbili sottoprogrammi che risolvono in tutto o
in parte il problema in esame.
Oltre ai sottoprogrammi di utilit` a, sono poi disponibili collezioni o librerie di sottoprogrammi oriente alla soluzione
di problemi in campi specici come ad esempio:
Matematica and Ottimizzatione;
Statistica e analisi dei Dati;
Progettazione e Analisi dei Sistemi di Controllo;
Elaborazione dei Segnali;
Elaborazione delle Immagini;
Test e Misure;
Biologia Computazionale;
Modelli e analisi Finanziarie.
18
CAPITOLO 2. CONSULTAZIONE DELLA DOCUMENTAZIONE (BOZZE, V. 1.0) 19
Per ognuno di questi argomenti (momno ` e una lista esaustiva) sono in commercio o sono disponibili su Internet uno
o pi` u toolkit, cio` e collezioni di sottoprogrammi, corredati dalla corrispondente documentazione che possono essere
integrati indipendentemente nellinstallazione base di MATLAB in modo da estenderne le funzionalit` a.
Anche in questo caso, prima di avviare lo sviluppo di nuove applicazioni ` e molto opportuno effettuare una ricerca
sul sito ufciale della MathWorks o pi` u in generale su Internet, per vericare cosa ` e gi` a disponibile.
2.3 Documentazione
La documentazione di MATLAB pu` o essere consultata sostanzialmente in tre modalit` a differenti:
dal prompt dei comandi;
da uninterfaccia graca;
attraverso un browser.
2.3.1 Consultazione dal prompt dei comandi
Nella prima modalit` a, si utilizza il comando help dal prompt dei comandi per determinare la sintassi e il comporta-
mento di una particolare funzione. Per esempio:
Esempio 2.1
Il comando
help eye
restituisce
EYE Identity matrix.
EYE(N) is the N-by-N identity matrix.
EYE(M,N) or EYE([M,N]) is an M-by-N matrix
with 1s on the diagonal and zeros elsewhere.
EYE(SIZE(A)) is the same size as A.
EYE with no arguments is the scalar 1.
EYE(M,N,CLASSNAME) or EYE([M,N],CLASSNAME)
is an M-by-N matrix with 1s of class CLASSNAME on
the diagonal and zeros elsewhere.
Example:
x = eye(2,3,int8);
See also speye, ones, zeros, rand, randn.
Reference page in Help browser
doc eye
CAPITOLO 2. CONSULTAZIONE DELLA DOCUMENTAZIONE (BOZZE, V. 1.0) 20
Si noti che lhelp usa caratteri maiuscoli per i nomi di funzioni e variabili per renderli evidenti rispetto al resto
del testo. Quando si digita il nome di una funzione ` e necessario utilizzare sempre i corrispondenti caratteri minuscoli,
perch e MATLAB ` e case sensitive e tutte le funzioni sono in caratteri minuscoli (lowercase). Inoltre, esse sono orga-
nizzate in gruppi logici, e lelenco che le riporta ` e strutturato secondo tale organizzazione. Digitando solamente help
al prompt si ottengono tutti gli elenchi, con una breve descrizione della categoria.
Esempio 2.2
Per elencare tutte le funzioni matematiche si deve eseguire il comando
help matfun
che restituisce
Matrix functions - numerical linear algebra.
Matrix analysis.
norm - Matrix or vector norm.
normest - Estimate the matrix 2-norm.
rank - Matrix rank.
det - Determinant.
trace - Sum of diagonal elements.
null - Null space.
orth - Orthogonalization.
rref - Reduced row echelon form.
subspace - Angle between two subspaces.
Linear equations.
\ and / - Linear equation solution; use "help slash".
linsolve - Linear equation solution with extra control.
inv - Matrix inverse.
rcond - LAPACK reciprocal condition estimator
cond - Condition number with respect to inversion.
condest - 1-norm condition number estimate.
normest1 - 1-norm estimate.
chol - Cholesky factorization.
cholinc - Incomplete Cholesky factorization.
lu - LU factorization.
luinc - Incomplete LU factorization.
qr - Orthogonal-triangular decomposition.
lsqnonneg - Linear least squares with nonnegativity constraints.
pinv - Pseudoinverse.
lscov - Least squares with known covariance.
Eigenvalues and singular values.
eig - Eigenvalues and eigenvectors.
svd - Singular value decomposition.
gsvd - Generalized singular value decomposition.
eigs - A few eigenvalues.
svds - A few singular values.
CAPITOLO 2. CONSULTAZIONE DELLA DOCUMENTAZIONE (BOZZE, V. 1.0) 21
poly - Characteristic polynomial.
polyeig - Polynomial eigenvalue problem.
condeig - Condition number with respect to eigenvalues.
hess - Hessenberg form.
schur - Schur decomposition.
qz - QZ factorization for generalized eigenvalues.
ordschur - Reordering of eigenvalues in Schur decomposition.
ordqz - Reordering of eigenvalues in QZ factorization.
ordeig - Eigenvalues of quasitriangular matrices.
Matrix functions.
expm - Matrix exponential.
logm - Matrix logarithm.
sqrtm - Matrix square root.
funm - Evaluate general matrix function.
Factorization utilities
qrdelete - Delete a column or row from QR factorization.
qrinsert - Insert a column or row into QR factorization.
rsf2csf - Real block diagonal form to complex diagonal form.
cdf2rdf - Complex diagonal form to real block diagonal form.
balance - Diagonal scaling to improve eigenvalue accuracy.
planerot - Givens plane rotation.
cholupdate - rank 1 update to Cholesky factorization.
qrupdate - rank 1 update to QR factorization.
Osservazione 2.1
Si ricordi, come anticipato nel paragrafo 1.4, che il comando help myfun stampa sul prompt il commento inserito
allinizio dellimplementazione della funzione myfun.m. Con riferimento allesempio 1.12:
help rappr_num
restituisce
Sintassi:
stringa_rappr=rappr_num(numero)
stringa_rappr=rappr_num(numero, option, base)
Descrizione:
stringa_rappr=rappr_num(numero): restituisce la
stringa di caratteri corrispondente alla rappresentazione
del numero nella base 10 (valore di default).
stringa_rappr=rappr_num(numero, option, base):
restituisce la stringa di caratteri corrispondente alla
CAPITOLO 2. CONSULTAZIONE DELLA DOCUMENTAZIONE (BOZZE, V. 1.0) 22
Figura 2.1: Linterfaccia graca per consultare la documentazione, come si presenta al suo avvio.
rappresentazione del numero nella base indicata dopo
il parametro option, che deve essere pari a
base. Il numero puo essere rappresentato al
massimo nella base 36.
Dal prompt dei comandi ` e possibile eseguire una ricerca attraverso una parola chiave. A questo proposito si
pu` o utilizzare il comando lookfor parola chiave. Il comando restituisce il nome di tutte le funzioni che
contengono la parola chiave.
2.3.2 Consultazione da uninterfaccia graca
La seconda modalit` a di consultazione della documentazione fa uso dellinterfaccia graca dellhelp. A questa si pu` o
accedere in vari modi:
dal menu HELP nella barra dei menu;
dal menu start, dalla versione 7 in poi (in basso a sinistra nella nestra di MATLAB);
eseguendo il comando helpdesk dal prompt dei comandi;
eseguendo il comando doc nome funzione dal prompt dei comandi.
La gura 2.1 riporta la linterfaccia graca dellhelp come si presenta al suo avvio. Sulla sinistra ` e presente un menu
che consente di navigare tra i contenuti, lindice e le demo presenti nella documentazione. Tale menu permette inoltre
di effettuare delle ricerche sulla base di una parola chiave.
CAPITOLO 2. CONSULTAZIONE DELLA DOCUMENTAZIONE (BOZZE, V. 1.0) 23
Osservazione 2.2
Accedendo alla descrizione di una funzione attraverso linterfaccia graca, si noti come i contenuti siano pi ` u ricchi.
Spesso, infatti, la descrizione di una funzione ` e pi` u completa, sono presenti pi ` u esempi, suggerimenti e le referenze.
A tal proposito si confronti la descrizione della funzione eye restituita dallinterfaccia graca con quella restituita al
prompt dei comandi (vedi esempio 2.1).
Osservazione 2.3
Un altro vantaggio dellinterfaccia graca ` e dato dalla possibilit` a di navigare attraverso le demo installate. Queste
aiutano molto spesso il neoto, e non solo, allapproccio e alla risoluzione di problemi specici. Permettono, infatti,
sia di esplorare rapidamente le funzionalit` a offerte dallambiente di sviluppo, sia di scoprire la funzione che potrebbe
essere utile.
2.3.3 Consultazione da un browser
La terza modalit` a di consultazione della documentazione consiste nelluso della documentazione disponibile on-line
allindirizzo http://www.mathworks.com/access/helpdesk/help/helpdesk.html. Da tale pagina
web si pu` o accedere alla descrizione delle funzioni, proprio come attraverso linterfaccia graca.
Sempre da tale indirizzo ` e possibile scaricare gratuitamente la documentazione in formato Portable Document
Format (PDF).
2.4 Consigli utili
Lindirizzo http://www.mathworks.com/matlabcentral ` e un sito di scambio aperto per la comunit` a di
utenti di MATLAB. In particolare, dalla sezione File Exchange ` e possibile scaricare gratuitamente funzioni, script e
tool svilupppati da utenti della comunit` a.
Inne, la Mathworks (societ` a proprietaria di MATLAB) organizza periodicamente dei webinars (seminari on-line)
la cui partecipazione, previa registrazione, ` e gratuita. Allindirizzo http://www.mathworks.com/company/
events/archived_webinars.html?s_cid=HP_E_RW ` e disponibile lelenco dei webinars registrati (che si
possono scaricare gratuitamente) e il calendario di quelli futuri.
Capitolo 3
Applicazioni con interfaccia testuale (bozze,
v. 1.0)
3.1 Input e output in MATLAB
Se lambiente MATLAB viene usato interattivamente dallutente per eseguire singole istruzioni, i dati da elaborare
vengono forniti attraverso assegnazioni a variabili appositamente create. Le istruzioni successive usano i valori me-
morizzati in tali variabili per produrre nuovi risultati che vengono a loro volta assegnati a nuove variabili no ad
ottenere i risultati nali richiesti.
Per quanto riguarda la visualizzazione dei risultati, lutente utilizza direttamente il meccanismo base di visualiz-
zazione che consiste semplicemente nellomettere il punto e virgola nale dellespressione da visualizzare.
In MATLAB sono per` o disponibili anche diverse istruzioni per linput e loutput dei dati, in modo da includere tali
operazioni allinterno di algoritmi, in modo analogo a quanto si fa nel linguaggio C con le operazioni di input (cin)
e di output (cout).
3.1.1 Input
Loperazione in input ` e descritta dalla seguente interfaccia:
function R = input ( string )
%
% Descrizione:
% propone allutente il testo contenuto in string e gli richiede
% di digitare una stringa di caratteri terminata dal carattere "invio";
% la stringa richiesta pu`o essere una qualsiasi espressione MATLAB
% valida che viene valutata nel workspace corrente e il cui risultato
% viene assegnato a R; se lutente preme il tasto "invio" senza
% digitare nulla, ad R viene asswgnata una matrice vuota
Esempio 3.1
Listruzione:
>> x = input(Dammi un intero);
24
CAPITOLO 3. APPLICAZIONI CON INTERFACCIA TESTUALE (BOZZE, V. 1.0) 25
produce la visualizzazione della stringa Dammi un intero, e lattesa da parte dellambiente matlab di un valore.
Se lutente digita ad esempio il numero 142 seguito da invio, il valore 142 viene assegnato allo scalare x.
Listruzione:
>> V = input(Dammi un vettore);
produce la visualizzazione della stringa Dammi un vettore, e lattesa da parte dellambiente matlab di una se-
quenza di valori delimitata da parentesi quadre. Se lutente digita ad esempio il vettore [ 1 3 -2 5 ] seguito da
invio, esso viene assegnato alla variabile V.
Listruzione:
>> A = input(Dammi una matrice);
produce la visualizzazione della stringa Dammi una matrice, e lattesa da parte dellambiente matlab di una
sequenza di valori su pi` u righe di uguale lunghezza delimitata da parentesi quadre. Se lutente digita ad esempio la
matrice [ 2 4 -1 0; -2 3 1 -1; 1 1 2 -1; 2 1 3 -5 ] seguita da invio, essa viene assegnata alla
variabile A.
Si noti che in realt` a in tutti e tre i casi viene usata sempre la stessa istruzione e che la natura del dato inserito (e
di conseguenza il tipo assunto dalla variabile a cui vengono assegnati i valori letti) dipende da cosa digita lutente. Si
tratta ancora una volta di un comportamento dovuto alla natura polimorfa delle espressioni MATLAB.
3.1.2 Output
Loperazione in output ` e descritta dalla seguente interfaccia:
function disp ( X )
%
%Descrizione:
% visualizza il contenuto dellarray X senza visualizzarne il nome;
% se X `e una stringa di caratteri, visualizza il testo contenuto
% nella stringa
Esempio 3.2
Listruzione:
>> disp(1.02332507)
produce la seguente visualizzazione:
1.0233
Listruzione:
>> disp([ 1.02 -13.011 10.3 14.007 ])
produce la seguente visualizzazione:
1.0200 -13.0110 10.3000 14.0070
Osservazione 3.1
CAPITOLO 3. APPLICAZIONI CON INTERFACCIA TESTUALE (BOZZE, V. 1.0) 26
Ciascuna chiamata al sottoprogramma disp produce la visualizzazione del parametro di ingresso X su una riga se-
parata. Volendo visualizzare due volte X sulla stessa riga occorre impiegare quindi ununica chiamata a disp. Dal-
linterfaccia di disp si comprende tuttavia che il sottoprogramma pu` o ricevere un solo parameteo di ingresso. La
soluzione ` e pertanto quella di concatenare in un unico array i valori che si vuole stampare su una sola linea e usare
larray cos` ottentuo come parametro di disp.
Ad esempio, le istruzioni:
>> A = [ 8 -13 10 14 ];
>> disp([ A A ])
producono la seguente visualizzazione:
8 -13 10 14 8 -13 10 14
Osservazione 3.2
Il metodo illustrato nellosservazione 3.1 non pu` o essere usato per visualizzare su ununica riga sia testi (cio` e dida-
scalie) sia valori numerici perch e non ` e possibile concatenare valori di tipo diverso in un unico array. In questo caso
occorre pertanto convertire i valori numerici in stringhe di caratteri per concatenare poi opportunamente queste ultime
con le didascalie ed ottenre cos` loutput desiderato.
A tal ne dobbiamo introdurre il seguente sottoprogramma di utilit` a:
function T = num2str ( X, n )
%
% Sintssi:
% T = num2str ( X )
%
% Descrizione:
% converte la variabile numerica X nella sua rappresentazione sotto
% forma di stringa T; per ciascun valore vengono rappresentate
% allincirca 4 cifre e viene usata una notazione esponenziale se
% opportuno
%
% Sintssi:
% T = num2str ( X, n )
%
% Descrizione:
% converte la variabile numerica X nella sua rappresentazione sotto
% forma di stringa T; per ciascun valore vengono rappresentate al
% massimo n cifre e viene usata una notazione esponenziale se opportuno;
% il numero di cifre utilizzate dipende anche dallordine di grandezza
% del vaore da rappresentare
che risulta avere uninterfaccia polimorfa.
Ad esempio, listruzione:
>> disp( [ Il vettore risultante `e: num2str([ 8 -13 10 14 ]) ] )
produce la seguente visualizzazione:
Il vettore risultante `e: 8 -13 10 14
CAPITOLO 3. APPLICAZIONI CON INTERFACCIA TESTUALE (BOZZE, V. 1.0) 27
3.2 Un programma completo
Come abbiamo gi` a osservato pi ` u volte, limpiego pi ` u immediato dellambiente MATLAB consiste nel richiedere
lesecuzione di singole istruzioni in modo interattivo. In altre parole lutente richiede lesecuzione di singole azioni
elaborative, esamina leffetto di tali azioni e decide di conseguenza le successive azioni da intraprendere. In alcuni
casi tale modo di procedere pu` o fare uso di script per evitare di digitare pi ` u volte le sequenze di istruzioni che vanno
ripetute pi ` u volte.
Ad esempio, volendo risolvere un sistema lineare caratterizzato da una matrice dei coefcienti e da un vettore dei
termini noti, si pu` o procedere nel modo seguente:
1. si assegna a due variabili A e B la matrice dei coefcienti e il vettore colonna dei termini noti
1
:
>> A = [ 2 4 -1 0; -2 3 1 -1; 1 1 2 -1; 2 1 3 -5 ];
>> B = [ 1; 2; -2; -1 ];
2. si calcola la soluzione usando loperatore \ e la si visualizza direttamente omettendo il punto e virgola nale:
>> X = A \ B
3. si osserva il vettore risultato visualizzato direttamente dallambiente:
X =
-0.7302
0.3254
-1.1587
-0.7222
Volendo visualizzare il vettore soluzione con qualche didascalia esplicativa, si potrebe ad esempio impiegare i
sottoprogrammi disp e num2str digitando le istruzioni:
disp(La soluzione `e: );
for i=1:size(X,1)
disp([x( num2str(i) ) = num2str(X(i)) ])
end
Se al posto del passo 3 vengono digitate queste istruzioni, il vettore colonna X viene visualizzato come segue:
La soluzione `e:
x(1) = -0.73016
x(2) = 0.3254
x(3) = -1.1587
x(4) = -0.72222
Si noti che volendo risolvere diversi sistemi lineari, per evitare di digitare pi ` u volte le istruzioni di output, queste
potrebbero essere memorizzate in un le e richiamate come script. Ad esempio, assumendo che le istruzioni per
la visualizzazione del vettore soluzione X siano meorizzate nel le disp soluzioni.m, per risolvere un sistema
lineare si procederebbe come segue:
1. si assegna a due variabili A e B la matrice dei coefcienti e il vettore colonna dei termini noti:
1
Poich e qui lo scopo ` e quello di illustrare la struttura delle applicazioni con interfaccia verso lutente di tipo testuale, in tutto il pragrafo si
assume per semplicit` a che il sistema da risolvere sia determinato e ammetta ununica soluzione.
CAPITOLO 3. APPLICAZIONI CON INTERFACCIA TESTUALE (BOZZE, V. 1.0) 28
>> A = [ 2 4 -1 0; -2 3 1 -1; 1 1 2 -1; 2 1 3 -5 ];
>> B = [ 1; 2; -2; -1 ];
2. si calcola la soluzione usando loperatore \, chiudendo listruzione con il punto e virgola nale per evitare la
visualizzazione del risultato:
>> X = A \ B;
3. si richiede la visualizzazione del risultato richiamando lo script disp soluzioni.m:
>> disp_soluzioni;
4. si osserva il vettore risultato cos` visualizzato:
La soluzione `e:
x(1) = -0.73016
x(2) = 0.3254
x(3) = -1.1587
x(4) = -0.72222
Se per` o si vuole disporre di ununica applicazione che permetta allutente di richiedere la soluzione di un sistema
lineare attraverso un solo comando, ` e necessario strutturare il codice in sottoprogrammi. Dalle considerazioni fatte,
nel caso specico una possibile suddivisione in sottoprogrammi poterebbe essere la seguente
2
:
function risolvi_sistema_lineare
%
% risolve un sistema lineare determinato e con ununica soluzione
% la matrice dei coefficienti e il vettore dei termini noti devono
% essere forniti dallutente sullo stdin; la soluzione viene visualizzata
% sullo stdout
function stampa_soluzione ( X )
%
% Visualizza la soluzione X (vettore colonna) nel formato:
% X(1)=...
% X(2)=...
% ...
% X(m)=...
Scegliendo unorganizzazione in un solo le la soluzione completa ` e:
function risolvi_sistema_lineare
%
% risolve un sistema lineare determinato e con ununica soluzione
% la matrice dei coefficienti e il vettore dei termini noti devono
% essere forniti dallutente sullo stdin; la soluzione viene visualizzata
% sullo stdout
A = input(Dammi la matrice dei coefficienti (divisa per righe): \n);
B = input(Dammi il vettore dei termini noti (vettore colonna): \n);
2
La decomposizione di unapplicazione in sottoprogrammi non ` e generalmente unica e dipende dai criteri di progetto adottati dal programmatore.
CAPITOLO 3. APPLICAZIONI CON INTERFACCIA TESTUALE (BOZZE, V. 1.0) 29
X = A \ B;
disp_soluzione(X);
return
%--------------------------------------------------------------------------
function stampa_soluzione ( X )
%
% Visualizza la soluzione X (vettore colonna) nel formato:
% X(1)=...
% X(2)=...
% ...
% X(m)=...
for i=1:length(X)
disp([x(, num2str(i), ) = , num2str(X(i))]);
end
return
Il nome del le deve ovviamente essere risolvi sistema lineare.m per consentire la chiamata al sotto-
programma principale dallambiente MATLAB.