1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
|
---
language: Matlab
contributors:
- ["mendozao", "http://github.com/mendozao"]
- ["jamesscottbrown", "http://jamesscottbrown.com"]
- ["Colton Kohnke", "http://github.com/voltnor"]
translators:
- ["Samuele Gallerani", "http://github.com/fontealpina"]
lang: it-it
filename: matlab-it.md
---
MATLAB sta per MATrix LABoratory ed è un potente linguaggio per il calcolo numerico comunemente usato in ingegneria e matematica.
```matlab
% I commenti iniziano con il segno percentuale.
%{
I commenti multilinea
assomigliano a
qualcosa
del genere
%}
% i comandi possono essere spezzati su più linee, usando '...':
a = 1 + 2 + ...
+ 4
% i comandi possono essere passati al sistema operativo
!ping google.com
who % Mostra tutte le variabili in memoria
whos % Mostra tutte le variabili in memoria, con i loro tipi
clear % Cancella tutte le tue variabili dalla memoria
clear('A') % Cancella una particolare variabile
openvar('A') % Apre la variabile in un editor di variabile
clc % Cancella il contenuto della Command Window
diary % Attiva il log della Command Window su file
ctrl-c % Interrompe il calcolo corrente
edit('myfunction.m') % Apre la funzione/script nell'editor
type('myfunction.m') % Stampa il codice della funzione/script sulla Command Window
profile on % Attiva la profilazione del codice
profile off % Disattiva la profilazione del codice
profile viewer % Apre il profilatore
help comando % Mostra la documentazione di comando sulla Command Window
doc comando % Mostra la documentazione di comando sulla Help Window
lookfor comando % Cerca comando nella prima linea di commento di tutte le funzioni
lookfor comando -all % Cerca comando in tutte le funzioni
% Formattazione dell'output
format short % 4 decimali in un numero float
format long % 15 decimali
format bank % Solo due cifre decimali - per calcoli finaziari
fprintf('text') % Stampa "text" a terminale
disp('text') % Stampa "text" a terminale
% Variabili ed espressioni
miaVariabile = 4 % Il pannello Workspace mostra la nuova variabile creata
miaVariabile = 4; % Il punto e virgola evita che l'output venga stampato sulla Command Window
4 + 6 % ans = 10
8 * myVariable % ans = 32
2 ^ 3 % ans = 8
a = 2; b = 3;
c = exp(a)*sin(pi/2) % c = 7.3891
% La chiamata di funzioni può essere fatta in due modi differenti:
% Sintassi standard di una funzione:
load('myFile.mat', 'y') % argomenti tra parentesi, separati da virgole
% Sintassi di tipo comando:
load myFile.mat y % Non ci sono parentesi e gli argometi sono separati da spazi
% Notare la mancanza di apici nella sintassi di tipo comando: gli input sono sempre passati come
% testo letterale - non è possibile passare valori di variabili. Inoltre non può ricevere output:
[V,D] = eig(A); % Questa non ha una forma equivalente con una sintassi di tipo comando
[~,D] = eig(A); % Se si vuole solo D e non V
% Operatori logici
1 > 5 % ans = 0
10 >= 10 % ans = 1
3 ~= 4 % Not equal to -> ans = 1
3 == 3 % equal to -> ans = 1
3 > 1 && 4 > 1 % AND -> ans = 1
3 > 1 || 4 > 1 % OR -> ans = 1
~1 % NOT -> ans = 0
% Gli operatori logici possono essere applicati alle matrici:
A > 5
% Per ogni elemento, se la condizione è vera, quell'elemento vale 1 nella matrice risultante
A( A > 5 )
% Restituisce un vettore contenente gli elementi in A per cui la condizione è vera
% Stringhe
a = 'MyString'
length(a) % ans = 8
a(2) % ans = y
[a,a] % ans = MyStringMyString
% Celle
a = {'one', 'two', 'three'}
a(1) % ans = 'one' - ritorna una cella
char(a(1)) % ans = one - ritorna una stringa
% Strutture
A.b = {'one','two'};
A.c = [1 2];
A.d.e = false;
% Vettori
x = [4 32 53 7 1]
x(2) % ans = 32, gli indici in Matlab iniziano da 1, non da 0
x(2:3) % ans = 32 53
x(2:end) % ans = 32 53 7 1
x = [4; 32; 53; 7; 1] % Vettore colonna
x = [1:10] % x = 1 2 3 4 5 6 7 8 9 10
% Matrici
A = [1 2 3; 4 5 6; 7 8 9]
% Le righe sono separate da punto e virgola, mentre gli elementi sono separati da spazi
% A =
% 1 2 3
% 4 5 6
% 7 8 9
A(2,3) % ans = 6, A(row, column)
A(6) % ans = 8
% (implicitamente concatena le colonne in un vettore, e quindi gli indici sono riferiti al vettore)
A(2,3) = 42 % Aggiorna riga 2 colonna 3 con 42
% A =
% 1 2 3
% 4 5 42
% 7 8 9
A(2:3,2:3) % Crea una nuova matrice a partire da quella precedente
%ans =
% 5 42
% 8 9
A(:,1) % Tutte le righe nella colonna 1
%ans =
% 1
% 4
% 7
A(1,:) % Tutte le colonne in riga 1
%ans =
% 1 2 3
[A ; A] % Concatenazione di matrici (verticalmente)
%ans =
% 1 2 3
% 4 5 42
% 7 8 9
% 1 2 3
% 4 5 42
% 7 8 9
% è equivalente a
vertcat(A,A);
[A , A] % Concatenazione di matrici (orrizontalmente)
%ans =
% 1 2 3 1 2 3
% 4 5 42 4 5 42
% 7 8 9 7 8 9
% è equivalente a
horzcat(A,A);
A(:, [3 1 2]) % Ripristina le colonne della matrice originale
%ans =
% 3 1 2
% 42 4 5
% 9 7 8
size(A) % ans = 3 3
A(1, :) =[] % Rimuove la prima riga della matrice
A(:, 1) =[] % Rimuove la prima colonna della matrice
transpose(A) % Traspone la matrice, equivale a:
A one
ctranspose(A) % Trasposizione hermitiana della matrice
% (ovvero il complesso coniugato di ogni elemento della matrice trasposta)
% Aritmetica Elemento per Elemento vs. Artimetica Matriciale
% Gli operatori aritmetici da soli agliscono sull'intera matrice. Quando sono preceduti
% da un punto, allora agiscono su ogni elemento. Per esempio:
A * B % Moltiplicazione matriciale
A .* B % Moltiplica ogni elemento di A per il corrispondente elemento di B
% Ci sono diverse coppie di funzioni, in cui una agisce su ogni elemento, e
% l'altra (il cui nome termina con m) agisce sull'intera matrice.
exp(A) % Calcola l'esponenziale di ogni elemento
expm(A) % Calcola la matrice esponenziale
sqrt(A) % Calcola la radice quadrata di ogni elemento
sqrtm(A) % Trova la matrice di cui A nè è la matrice quadrata
% Plot di grafici
x = 0:.10:2*pi; % Crea un vettore che inizia a 0 e termina 2*pi con incrementi di .1
y = sin(x);
plot(x,y)
xlabel('x axis')
ylabel('y axis')
title('Plot of y = sin(x)')
axis([0 2*pi -1 1]) % x range da 0 a 2*pi, y range da -1 a 1
plot(x,y1,'-',x,y2,'--',x,y3,':') % Per stampare più funzioni in unico plot
legend('Line 1 label', 'Line 2 label') % Aggiunge un etichetta con il nome delle curve
% Metodo alternativo per stampare funzioni multiple in un unico plot.
% mentre 'hold' è on, i comandi sono aggiunti al grafico esistene invece di sostituirlo
plot(x, y)
hold on
plot(x, z)
hold off
loglog(x, y) % Un plot di tipo log-log
semilogx(x, y) % Un plot con asse x logaritmico
semilogy(x, y) % Un plot con asse y logaritmico
fplot (@(x) x^2, [2,5]) % Stampa la funzione x^2 da x=2 a x=5
grid on % Mostra la griglia, disattivare con 'grid off'
axis square % Rende quadrata la regione individuata dagli assi
axis equal % Iposta l'aspetto del grafico in modo che le unità degli assi siano le stesse
scatter(x, y); % Scatter-plot
hist(x); % Istogramma
z = sin(x);
plot3(x,y,z); % Stampa una linea 3D
pcolor(A) % Heat-map di una matrice: stampa una griglia di rettangoli, colorati in base al valore
contour(A) % Contour plot di una matrice
mesh(A) % Stampa come una superfice di mesh
h = figure % Crea un nuovo oggetto figura, con handle f
figure(h) % Rende la figura corrispondente al handle h la figura corrente
close(h) % Chiude la figura con handle h
close all % Chiude tutte le figure
close % Chiude la figura corrente
shg % Riutilizza una finestra grafica già esistente, o se necessario ne crea una nuova
clf clear % Pulisce la figura corrente, e resetta le proprietà della figura
% Le proprietà possono essere impostate e modificate attraverso l'handle della figura.
% Si può salvare l'handle della figura quando viene creata.
% La funzione gcf restituisce un handle alla figura attuale.
h = plot(x, y); % Si può salvare un handle della figura quando viene creata
set(h, 'Color', 'r')
% 'y' yellow; 'm' magenta, 'c' cyan, 'r' red, 'g' green, 'b' blue, 'w' white, 'k' black
set(h, 'LineStyle', '--')
% '--' linea continua, '---' tratteggiata, ':' puntini, '-.' trattino-punto, 'none' nessuna linea
get(h, 'LineStyle')
% La funzione gca restituisce un handle degli assi della figura corrente
set(gca, 'XDir', 'reverse'); % Inverte la direzione dell'asse x
% Per creare una figura che contiene diverse sottofigure, usare subplot
subplot(2,3,1); % Seleziona la prima posizione in una griglia 2 per 3 di sottofigure
plot(x1); title('First Plot') % Stampa qualcosa in questa posizione
subplot(2,3,2); % Seleziona la seconda posizione nella griglia
plot(x2); title('Second Plot') % Stampa qualcosa in questa posizione
% Per usare funzioni o script, devono essere nel tuo path o nella directory corrente
path % Mostra il path corrente
addpath /path/to/dir % Aggiunge al path
rmpath /path/to/dir % Rimuove dal path
cd /path/to/move/into % Cambia directory
% Le variabili possono essere salvate in file .mat
save('myFileName.mat') % Salva le variabili nel tuo Workspace
load('myFileName.mat') % Carica variabili salvate nel tuo Workspace
% M-file Scripts
% I file di script sono file esterni che contengono una sequenza di istruzioni.
% Permettono di evitare di scrivere ripetutamente lo stesso codice nella Command Window
% Hanno estensione .m
% M-file Functions
% Come gli script, hanno la stessa estensione .m
% Ma possono accettare argomenti di input e restituire un output.
% Inoltre, hanno un proprio workspace (differente scope delle variabili).
% Il nome della funzione dovrebbe coincidere con il nome del file (quindi salva questo esempio come double_input.m).
% 'help double_input.m' restituisce i commenti sotto alla linea iniziale della funzione
function output = double_input(x)
%double_input(x) restituisce il doppio del valore di x
output = 2*x;
end
double_input(6) % ans = 12
% Si possono anche avere sottofunzioni e funzioni annidate.
% Le sottofunzioni sono nello stesso file della funzione primaria, e possono solo essere
% chiamate da funzioni nello stesso file. Le funzioni annidate sono definite dentro ad altre
% funzioni, e hanno accesso ad entrambi i workspace.
% Se si vuole creare una funzione senza creare un nuovo file si può usare una
% funzione anonima. Utile quando si vuole definire rapidamente una funzione da passare ad
% un'altra funzione (es. stampa con fplot, valutare un integrale indefinito
% con quad, trovare le radici con fzenzro, o trovare il minimo con fminsearch).
% Esempio che restituisce il quadrato del proprio input, assegnato all'handle sqr:
sqr = @(x) x.^2;
sqr(10) % ans = 100
doc function_handle % scopri di più
% Input dell'utente
a = input('Enter the value: ')
% Ferma l'esecuzione del file e cede il controllo alla tastiera: l'utente può esaminare
% o cambiare variabili. Digita 'return' per continuare l'esecuzione, o 'dbquit' per uscire
keyboard
% Importarare dati (anche xlsread/importdata/imread per excel/CSV/image file)
fopen(filename)
% Output
disp(a) % Stampa il valore della variabile a
disp('Hello World') % Stampa una stringa
fprintf % Stampa sulla Command Window con più controllo
% Istruzioni condizionali (le parentesi sono opzionali, ma un buon stile)
if (a > 15)
disp('Maggiore di 15')
elseif (a == 23)
disp('a è 23')
else
disp('nessuna condizione verificata')
end
% Cicli
% NB. Ciclare su elementi di vettori/matrici è lento!
% Dove possibile, usa funzioni che agiscono sull'intero vettore/matrice
for k = 1:5
disp(k)
end
k = 0;
while (k < 5)
k = k + 1;
end
% Misurare la durata dell'esecuzione del codice: 'toc' stampa il tempo trascorso da quando 'tic' è stato chiamato
tic
A = rand(1000);
A*A*A*A*A*A*A;
toc
% Connessione a un Database MySQL
dbname = 'database_name';
username = 'root';
password = 'root';
driver = 'com.mysql.jdbc.Driver';
dburl = ['jdbc:mysql://localhost:8889/' dbname];
javaclasspath('mysql-connector-java-5.1.xx-bin.jar');
% xx dipende dalla versione, download disponibile all'indirizzo http://dev.mysql.com/downloads/connector/j/
conn = database(dbname, username, password, driver, dburl);
sql = ['SELECT * from table_name where id = 22'] % Esempio istruzione sql
a = fetch(conn, sql) % conterra i tuoi dati
% Funzioni matematiche comuni
sin(x)
cos(x)
tan(x)
asin(x)
acos(x)
atan(x)
exp(x)
sqrt(x)
log(x)
log10(x)
abs(x)
min(x)
max(x)
ceil(x)
floor(x)
round(x)
rem(x)
rand % Numeri pseudocasuali uniformemente distribuiti
randi % Numeri interi pseudocasuali uniformemente distrubuiti
randn % Numeri pseudocasuali distrbuiti normalmente
% Costanti comuni
pi
NaN
inf
% Risolvere equazioni matriciali
% Gli operatori \ e / sono equivalenti alle funzioni mldivide e mrdivide
x=A\b % Risolve Ax=b. Più veloce e più accurato numericamente rispetto ad usare inv(A)*b.
x=b/A % Risolve xA=b
inv(A) % Calcola la matrice inversa
pinv(A) % Calcola la matrice pseudo-inversa
% Funzioni comuni su matrici
zeros(m,n) % Matrice m x n di zeri
ones(m,n) % Matrice m x n di uni
diag(A) % Estrae gli elementi della diagonale della matrice A
diag(x) % Costruisce una matrice con elementi diagonali uguali agli elementi di x, e zero negli altri elementi
eye(m,n) % Matrice identità
linspace(x1, x2, n) % Ritorna n punti equamente distanziati, con minimo x1 e massimo x2
inv(A) % Matrice inversa di A
det(A) % Determinante di A
eig(A) % Autovalori e autovettori di A
trace(A) % Traccia della matrice - equivalente a sum(diag(A))
isempty(A) % Verifica se l'array è vuoto
all(A) % Verifica se tutti gli elementi sono nonzero o veri
any(A) % Verifica se almento un elemento è nonzero o vero
isequal(A, B) % Verifica l'uguaglianza di due array
numel(A) % Numero di elementi nella matrice
triu(x) % Ritorna la parte triangolare superiore di x
tril(x) % Ritorna la parte triangolare inferiore di x
cross(A,B) % Ritorna il prodotto vettoriale dei vettori A e B
dot(A,B) % Ritorna il prodotto scalare di due vettori (devono avere la stessa lunghezza)
transpose(A) % Ritorna la trasposta di A
fliplr(A) % Capovolge la matrice da sinistra a destra
flipud(A) % Capovolge la matrice da sopra a sotto
% Fattorizzazione delle matrici
[L, U, P] = lu(A) % Decomposizione LU: PA = LU, L è il triangolo inferiore, U è il triangolo superiore, P è la matrice di permutazione
[P, D] = eig(A) % Auto-decomposizione: AP = PD, le colonne di P sono autovettori e gli elementi sulle diagonali di D sono autovalori
[U,S,V] = svd(X) % SVD: XV = US, U e V sono matrici unitarie, S ha gli elementi della diagonale non negativi in ordine decrescente
% Funzioni comuni su vettori
max % elemento più grande
min % elemento più piccolo
length % lunghezza del vettore
sort % ordina in modo crescente
sum % somma degli elementi
prod % prodotto degli elementi
mode % valore moda
median % valore mediano
mean % valore medio
std % deviazione standard
perms(x) % lista tutte le permutazioni di elementi di x
% Classi
% Matlab supporta la programmazione orientata agli oggetti.
% La classe deve essere messa in un file con lo stesso nome della classe e estensione .m
% Per iniziare, creiamo una semplice classe per memorizzare waypoint GPS
% Inizio WaypointClass.m
classdef WaypointClass % Il nome della classe.
properties % Le proprietà della classe funzionano come Strutture
latitude
longitude
end
methods
% Questo metodo che ha lo stesso nome della classe è il costruttore
function obj = WaypointClass(lat, lon)
obj.latitude = lat;
obj.longitude = lon;
end
% Altre funzioni che usano l'oggetto Waypoint
function r = multiplyLatBy(obj, n)
r = n*[obj.latitude];
end
% Se si vuole aggiungere due oggetti Waypoint insieme senza chiamare
% una funzione speciale si può sovradefinire una funzione aritmetica di Matlab come questa:
function r = plus(o1,o2)
r = WaypointClass([o1.latitude] +[o2.latitude], ...
[o1.longitude]+[o2.longitude]);
end
end
end
% End WaypointClass.m
% Si può creare un oggetto della classe usando un costruttore
a = WaypointClass(45.0, 45.0)
% Le proprietà della classe si comportano esattamente come una Struttura Matlab.
a.latitude = 70.0
a.longitude = 25.0
% I metodi possono essere chiamati allo stesso modo delle funzioni
ans = multiplyLatBy(a,3)
% Il metodo può anche essere chiamato usando una notazione con punto. In questo caso, l'oggetto
% non necessita di essere passato al metodo.
ans = a.multiplyLatBy(a,1/3)
% Le funzioni Matlab possono essere sovradefinite per gestire oggetti.
% Nel metodo sopra, è stato sovradefinito come Matlab gestisce
% l'addizione di due oggetti Waypoint.
b = WaypointClass(15.0, 32.0)
c = a + b
```
## Di più su Matlab
* Sito ufficiale [http://http://www.mathworks.com/products/matlab/](http://www.mathworks.com/products/matlab/)
* Forum ufficiale di MATLAB: [http://www.mathworks.com/matlabcentral/answers/](http://www.mathworks.com/matlabcentral/answers/)
|