--- contributors: - ["mendozao", "http://github.com/mendozao"] - ["jamesscottbrown", "http://jamesscottbrown.com"] - ["Colton Kohnke", "http://github.com/voltnor"] translators: - ["Samuele Gallerani", "http://github.com/fontealpina"] 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.' 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/)