MATLAB – základy I.Pultarová, únor 2002 MATrix LABoratory. Nejnovější je verze 6 (release 12). Základní internetový odkaz - http://www.mathworks.com. 1. Prostředí, stručný popis oken Command Window – příkazové okno pro zadávání příkazů v jazyku Matlabu. Workspace – zde se zobrazuje obsah paměti; je možné jednotlivé proměnné editovat. Command History – dříve zadané příkazy; označení datem. Current Directory – prohlížeč souborů a adresářů. Launch Pad – rychlý přístup k hlavním součástem MATLABu. Help / Matlab Help v hlavní nabídce - zobrazí nápovědu. File / Set Path nastaví cesty k používaným adresářům. File / Preferences – základní nastavení komponent Matlabu. 2. Základní vlastnosti Základní datový typ je matice. Za znakem % následuje komentář. Středník za příkazem potlačí zobrazení výsledku. Příkazy na jednom řádku se oddělují čárkami nebo středníky. Má-li příkaz pokračovat na dalším řádku, napíše se na konci ... a stiskne Enter. MATLAB rozlišuje velká a malá písmena (case-sensitive). Standardně se počítá s desetinnými čísly, vyjádření výsledků ve zlomcích zajistí příkaz format rat. Příkaz format long nebo format long e(zobrazuje se všech 16 cifer), format short (4 desetinná místa). 3. Některé matematické funkce cos kosinus sin sinus tan tangens exp exponenciala o zakladu e log, log10, log2 logaritmus přirozený, o základu 10 a 2 sqrt (druhá) odmocnina abs absolutní hodnota imag, real, conj imaginární a reálná část komplexního čísla, komplexně sdružené číslo round, floor, ceil zaokrouhlení, zaokrouhlení doleva, doprava 4. Relační a logické operátory <, <=, >, >=, ==, ~= &, |, ~ 5. Operace s maticemi u = [7 8 9] řádkový vektor v = [3; 4; 5] sloupcový vektor v = u’ transpozice vektoru w = 2:8 ektor [ 2 3 4 5 6 7 8] y = 2:3:20 vektor [2 5 8 11 14 17 20] y = 3: end prvky vektoru y s indexy od 3. do posledního X = linspace(a, b, N) řádkový vektor N čísel ekvidistantně rozložených mezi a a b, X(1)=a, X(N)=b X = logspace(a, b, N) řádkový vektor N čísel exponenciálně rozložených mezi a a b, X(1)=a, X(N)=b A = [1 2 3; 5 6 7] matice o 2 řádcích a 3 sloupcích B = sparse(A) řídká matice eye(3) jednotková matice 3x3 ones(3) matice jedniček zeros(3) matice nul diag(w) diagonální matice s vektorem w na diagonále diag(A) diagonála matice A (vektor) spdiags(B, d, m, n) řídká matice typu m x n vytvořená ze sloupců matice B umístěných na pozice určené vektorem d full(A) zobrazení řídké matice v „plném“ tvaru spy(A) schematické zobrazení „zaplnění“ matice A rand(3,4) matice typu 3 x 4 náhodných čísel mezi 0 a 1 (rovnoměrné rozdělení) rand('state',0) nastavení generátoru náhodných čísel do stavu 0 randn(3) matice náhodných čísel s normálním rozdělením (střední hodnota je 0, rozptyl je 1) ones(4, 8) obdélníková matice jedniček zeros(size(B)) nulová matice stejného typu jako B M = zeros(3, 4, 5) trojrozměrné pole nul B(3,1) = 8 změna prvku v matici B(k) k-tý prvek v matici (počítáno po sloupcích) 1:8 nebo 1:0.3:2 operátor dvojtečka: vektor [1 2 3 4 5 6 7 8] nebo [1 1.3 1.6 1.9] u = A(:, 3) vektoru u se přiřadí hodnoty třetího sloupce z matice A, symbol dvojtečka se zde dosazuje místo hodnoty "všechny" A(2, :) = v druhému řádku v matici A se přidělí hodnoty vektoru v A([2 5], :) 2. a 5. řádek v matici A A([2 5], :) = A([5 2], :)prohození 2. a 5. řádku v matici A A(2 : 5, 3 : 4) submatice matice A složená z průsečíků řádků 2 až 5 a sloupců 3 až 4 A(:) sloupcový vektor složený ze všech sloupců matice A B = [A b] matice složená z matice A a vektoru b B = [A A'; inv(A), A] matice složená ze 4 submatic B = A([2 1 3], :) permutace řádků matice A(:, 2) = [] odstranění 2. sloupce z matice v(2: 2: 10) = [] odstranění všech sudých složek vektoru Operátory: +, -, , /, \ (tzv. dělení "zleva"), ^ (umocnění), '(vytvoření adjungované matice), .* (násobení po prvcích), ./ (dělení po prvcích), .\ (dělení zleva po prvcích), .^ (umocnění po prvcích), .' (transpozice bez komplexního sdružení) A = A + 1 přičtení 1 ke všem prvkům matice A B = A + ones(3) součet dvou matic v = B * u násobení matic (vektorů) A * B násobení matic A .* B násobení matic "po prvcích" A' transpozice matice reshape(A, m, n) změna tvaru matice – sloupce se seřadí do jednoho a ten se poskládá do tvaru m x n sum(A) součet prvků ve sloupcích matice A, výsledek je řádkový vektor inv(A) inverse matice (A musí být čtvercová a regulární) pinv(A) pseudoinverse matice A x = A \ B maticové dělení - vyřešení soustavy rovnic s maticí A (čtvercová a regulární) a maticí pravé strany B (použvá se zhruba řečeno Gaussova eliminace); jestliže A není regulární, je řešení získáno metodou nejmenších čtverců (pro přeurčené soustavy) nebo je výsledkem jedno řešení nehomogenní soustavy s největším počtem nulových slože (pro nedourčené soustavy) x = pinv(A) * B řešení nedourčené soustavy lineárních rovnic pomocí Moore-Penroseovy pseudoinverze (minimalizace normy vektoru řešení) null(A) báze nulového prostoru matice A A / B maticové dělení - výsledkem je B' \ A' A ./ B dělení "po prvcích a / b" A .\ B dělení "po prvcích b / a" dot(x, y) skalární součin triu(A,n) horní trojúhelníková matice (od n-té diagonály) z matice A tril(A,m) dolní trojúhelníková matice (od m-té diagonály) z matice A det(A) determinant matice A (čtvercová) rank(A) hodnost matice A norm(A, p) norma matice A- sloupcová (p=1), řádková (p=Inf), největší singulární hodnota – viz. funkce svd (p=2), Frobeniova (p='fro') norm(v, p) l[p] norma vektoru v (1 ≤ p ≤ Inf) size(A) dvojice čísel [m n] (počet řádků a sloupců) length(A) ten větší z rozměrů matice numel(A) počet prvků v matici A trace(A) stopa [L, U, P] = lu(A) LU-rozklad matice A; platí PA = LU e = eig(A) vektor vlastních čísel matice A [U, S, V] = svd(A) rozklad na singulární čísla: A = U * S * V', U a V jsou unitární matice, S je diagonální matice singulárních čísel conv(u, v) konvoluce vektorů u, v isprime(A) test na prvočíslo, výsledek je 0 nebo 1 finite(A) test na Inf nebo NaN, výsledek je 0 nebo 1 mod(n, p) zbytek po celočíselném dělení n/p find(A > 7) vyhledávání sort(A) třídění 6. Pole s dimenzí větší než 2 Třetí dimenzi představuje 3. index, je nazývána „page“. A = zeros(2, 3, 4) trojrozměrné pole nul B = zeros(7, 8); B(:, :, 2) = ones(7, 8) přidání druhé „stránky“ k matici B 7. Polynomy p = [1 –2 8] reprezentace polynomu pomocí vektoru jeho koeficientů (v pořadí od nejvyšší mocniny) polyval(p, A) vyčíslení polynomu p v prvcích matice A polyvalm(p, A) vyčíslení polynomu v matici A (dosazení A za nezávisle proměnnou) roots(p) kořeny polynomu p p = polyfit(x, y, n) aproximace dat [x, y] polynomem stupne n ve smyslu nejmenších čtverců 8. Znaky a řeťezce a = 'slovo' proměnná typu řetězec a' transpozice a(2:4) část řetězce disp(a) zobrazení bez označení proměnné str2num(s) převede pole řetězců na pole znaků 9. Některé optimalizační funkce p = polyfit(x, y, n) aproximace dat [x, y] polynomem stupne n ve smyslu nejmenších čtverců yk = pchip(x, y, xk) interpolace po částech kubickým Hermiteovým polynomem yk = spline(x, y, xk) interpolace kubickou spline funkcí lsqcurvefit(@F, [x0], xdata, ydata) nelineární interpolace (metodou nejmenších čtverců); řeší úlohu najít x, pro které výraz norm(F(x,xdata) – ydata, 2)^2 nabývá svého minima x = fsolve(@F, x0) řešení rovnice F(x) = 0; počáteční přiblížení x0 10. Funkce pro řibližné řešení diferenciálních rovnic [T, Y] = ode45(@F, [0 1], [a b]) metoda Runge-Kutta 4.řádu pro soustavy diferenciálních rovnic odeset('AbsTol', 1e-6) nastavení parametrů pro řešiče diferenciálních rovnic 11. Některé další důležité konstanty a funkce pi číslo π i nebo j imaginární jednotka real(x) reálná část komplexního čísla/vektoru imag(x) imaginární část komplexního čísla/vektoru eps relativní přesnost pro operace v pohyblivé řádové čárce; např. 1 + 2^(-53) je 1 realmin 2^(-1022) nejmenší nenulové reálné číslo, (ale ve skutečnosti 2^(-1074) ≠ 0, 2^(-1074) = 0) realmax (2-eps)^1023 největší reálné číslo menší než Inf, (ale (2-eps)^1024 < Inf) Inf, inf "nekonečno", např 1/0 nebo hodnota větší než realmax NaN, nan nenumerický výraz (Not-a-Number) set() nastavení parametrů objektů get() parametry objektů f = inline('sin(x+a)', 'x', 'a') jednoářdková definice funkce clear all, clear functions, clear JmenoFunkce vymazání z paměti 12. M-soubory M-soubory jsou textové soubory s koncovkou .m, do kterých se píší funkce a skripty. Spouští se napsáním jména souboru na příkazový řádek a stisknutím Enter. Je vhodné volit název funkce stejný jako název souboru. Skript může pracovat s proměnnými v paměti MATLAbu a také po skončení běhu skriptu hodnoty proměnných zůstanou v paměti. Skripty nemají vstupní ani návratové hodnoty. Funkce používá vlastní paměťový prostor, může mít vstupní argumenty a vracet hodnoty. Po definici hlavní funkce mohou v m-souboru následovat definice dalších funkcí (tzv. subfunctions). Funkce i skripty obsahují příkazy v jazyku MATLAB. if (n > 0 && mod(n, 2) == 0) m = n / 2 else m = n end; rozhodování if (x < a) x = a ,elseif (x > b) x = b, else x = (a + b) / 2, end; rozhodování switch (Vyraz) case Hodnota, Prikaz, case Hodnota, Prikaz, ..., otherwise Prikaz, end; rozhodování – příkaz switch for i = 1 : 10, x(i) = i^2, end; cyklus for i = 1 : 2 : 10, x(i) = 0, end; cyklus while (Vyraz) Prikaz end; cyklus continue skok na další smyčku cyklu break ukončení cyklu disp('Chyba!') výpis na příkazový řádek function [VystupniData] = JmenoFunkce(VstupniData) Prikazy end zápis funkce function [maxim, minim] = extremy (a, b, delta) příklad definice funkce i = 1; for c = a : delta : b; x(i) = sin(c)*c; i = i + 1; end; maxim = max(x); minim = min(x); plot(a : delta : b, x); [u,v] = extremy(1,30,0.5) příklad volání funkce 13. Soubory a adresáře !dir za znakem ! následují příkazy systému path zobrazení prohledávaných cest (lze i z hlavní nabídky) addpath Cesta přidání k seznamu prohledávaných cest (lze i z hlavní nabídky) cd JmenoAdresare změna aktuálního adresáře type JmenoSouboru výpis souboru whos zobrazí proměnné v paměti a jejich hodnoty save 'JmenoSouboru' proměnné a jejich hodnoty se uloží do souboru JmenoSouboru.mat load 'JmenoSouboru' zkopíruje se do paměti obsah souboru JmenoSouboru.mat diary uložení příkazů z klávesnice do souboru ver informace o Matlabu a toolboxech s1 = fopen('soubor', 'w') otevření souboru pro zápis fprintf(s1, '%6.2f, %12d\n', x, n) formátovaný zápis do souboru (syntaxe dle jazyka C) s2 = fopen('soubor', 'r') otevření souboru pro čtení A = fscanf(s2, '%6.2f, %12d\n') čtení formátovaných dat ze souboru fclose(s1) uzavření souboru, uložení na disk y = wavread('soubor.wav') čtení zvukových wav-souborů wavwrite(y, 'soubor.wav') zápis zvukového wav-souboru 14. Kreslení Matlab umožňuje pokročilé grafické operace využitím „ukazatelů“ na grafické objekty. Se stromovou strukturou grafických objektů se lze seznámit v nápovědě: z hlavní nabídky Help / Matlab Help / karta Contents / složka Matlab / Reference / Graphics Object Propery Browser. fplot('sin', [-2 10]) vykreslí funkci x = 0 : pi/100 : 2*pi; y = sin(x); plot(x, y) vykreslí body o souřadnicích xi, yi spojené lomenou čarou plot(y) vykreslí body o souřadnicích i, yi spojené lomenou čarou plot(x, y, ':', x, sin(x-0.3), 'b--') vykreslí dva grafy do stejného obrázku, první tečkovaně, druhý čárkovaně modře plot(A) vykreslí sloupce matice (několik sérií bodů spojených lomenou čarou) plot(Z) je-li Z vektor komplexních čísel, vykreslí se body o souřadnicích real(Z) a imag(Z) t=0:0.2:2*pi; plot(cos(t)+i*sin(t), '*') kreslení komplexního vektoru (kružnice) t = 0 : pi/50 : 10*pi; plot3(sin(t), cos(t), t) parametrické 3-D kreslení t = 0:.01:2*pi; polar(t, abs(sin(2 * t) .* cos(2 * t))); parametrické kreslení [x, y, z] = pol2cart(theta, r, z) převedení z polárních nebo cylindrických souřadnic do kartézských [theta, r] = cart2pol(x, y) převedení z kartézských souřadnic do polárních nebo cylindrických [x, y, z] = sph2cart(theta, phi, r) převedení ze sférických souřadnic do kartézských [theta, phi, r] = cart2sph(x, y, z) převedení z kartézských souřadnic do sférických xlabel('rychlost [m/s]') označení vodorovné osy ylabel('čas [s]') označení svislé osy title('Pohyb kyvadla') nadpis grafu axis square, axis([-pi pi -1 1]) nastavení os souřadnic grid on, grid off zapnutí / vypnutí zobrazení souřadnic text(1, 1.5,'{\itNalezněte lokální maxima.}') umístění textu do grafu, používá se jazyka TeX hold on výstup do existujícího (posledního vytvořeného) grafu hold off překreslení předchozího grafického výstupu subplot(m, n, p) rozdělení aktuálního grafického okna na mxn částí v m řádcích a n sloupcích a nastavení grafického výstupu do p-tého z nich (počítáno po řádcích) cla vymazání aktivního grafu clf vymazání aktivního grafického okna [X, Y] = meshgrid(x, y) vytvoří uspořádanou množinu všech uspořádaných dvojic ze složek vektorů x a y, např.: [X, Y] = meshgrid(0:0.1:3, 0:0.4:5); surf(X, Y, sin(X .* Y)) [X, Y] = meshgrid(0:0.1:3, 0:0.1:3); surf(X, Y, sin(X .* Y), 'FaceColor', 'red', 'EdgeColor', 'none');... camlight left; lighting phong jiný příklad použití contour(X, Y, cos(X + Y)) vrstevnice contourf(X, Y, cos(X + Y)) vrstevnice (vybarvené plochy) surf([0 1;0 1;0 1],[0 0;1 1; 2 2],[1 1; 6 6; 1 1]) kreslení plochy po trojúhelnících (střecha) surfc(X, Y, cos(X + Y)) kreslení plochy a vrstevnic for k = 1: 50 ; y(k) = rand(1, 1) * k; plot(x, y); M(k) = getframe; end; movie(M, 2, 30) "pohyblivé" obrázky, přehrání (1x při nahrávání +) 2x, a to frekvencí 30 obr./s movie2avi(M, 'soubor') převedení sekvence obrázků na soubor formátu avi disp('Slova') výpis hlášení text(x, y, 'Slova') umístění textu do obrázku na souřadnice x, y b = ginput(3) vstup souřadnic 3 bodů vybraných pomocí myši gca “ukazatel” na aktivní graf gcf “ukazatel” na aktivní grafické okno set() nastavení parametrů grafického výstupu, např.: set(gca, 'DataAspectRatio', [1 1 1]) nastavení poměrů měřítek os souřadnic v aktivním grafu get() odečtení parametrů grafického výstupu, např.: get(gcf, 'Color') barva pozadí aktivního grafického okna