Potae a programovn 2 pro obor EST BPC
Počítače a programování 2 pro obor EST BPC 2 E PŘEDNÁŠKA 8 OSNOVA: a) 2 D grafické výstupy – doplnění b) Příkazy Matlabu c) Matice buněk a struktury d) 3 D grafické výstupy Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně
2 D grafické výstupy – doplnění (1/13) Graf funkce při proměnné vyskytující se ve výrazu několikrát Operaci je nutné prováděl prvek po prvku, tj. např. vynásobit jednotlivé elementy dvou vektorů (může být i tentýž vektor) – pro operace násobení, dělení a mocnina je nutné použít tečkovou notaci: např. y = x·sin(x) musí být zapsáno do formy y = x. *sin(x) x = -1: 0. 05: 1; y = x. *sin(x); figure() plot(x, y, 'r', 'Line. Width', 2) title('Function y = x·sin(x)') xlabel('x') ylabel('y') grid on Příklad: BPC 2 E_Ex 119. m
2 D grafické výstupy – doplnění (2/13) Funkce pro elementární zobrazení funkční závislosti popsané textovým řetězcem string v rozsahu proměné <lo, hi>: ezplot(string, [lo hi]) V řetězci se předpokládá jako proměnná symbol x figure() ezplot('x*sin(x)', [-1 1]) title('Function y = x·sin(x)') xlabel('x') ylabel('y') grid on Příklad: BPC 2 E_Ex 120. m
2 D grafické výstupy – doplnění (3/13) Funkce plot() je základní funkcí pro 2 D grafy, odvozenými funkcemi jsou funkce, které kreslí grafy s logaritmicky dělenými osami: semilogy() – y-ová osa má logaritmické dělení semilogx() – x-ová osa má logaritmické dělení loglog() – obě osy mají logaritmické dělení x = 0. 01: 10; y = log(x). *log 10(x); figure(1) semilogy(x, y, 'r', 'Line. Width', 3) title('Function y = ln(x) · log(x)') xlabel('x') ylabel('y') grid on
2 D grafické výstupy – doplnění (4/13) figure(2) semilogx(x, y, 'r', 'Line. Width', 3) title('Function y = ln(x) · log(x)') xlabel('x') ylabel('y') grid on figure(3) loglog(x, y, 'r', 'Line. Width', 3) title('Function y = ln(x) · log(x)') xlabel('x') ylabel('y') grid on Příklad: BPC 2 E_Ex 121. m
2 D grafické výstupy – doplnění (5/13) Funkce scatter() vykreslí 2 D bodový graf: scatter(x, y, size, shape) Vykreslí graf funkce x = f(y) s body o velikosti size (plocha pro bod v pixelech) a tvaru bodu shape. Vlastností 'filled' lze definovat plný bod. Argument ve funkci title obsahuje znaky horního indexu (^a = a bude jako horní index) x = 0: 1: 10; y = 2*x. ^(1/3); figure() scatter(x, y, 100, 's', 'filled') title('Function y = 2 x^1^/^3') xlabel('x') ylabel('y') grid on Příklad: BPC 2 E_Ex 122. m
2 D grafické výstupy – doplnění (6/13) Funkce stem() vykreslí 2 D diskrétní graf: stem(x, y, properties) x = -4*pi: 0. 25*pi: 4*pi; y 1 = cos(x); y 2 = sin(x). /x; figure() stem(x, y 1); title('Function y = cos(x)') xlabel('x') ylabel('y') grid on figure() stem(x, y 2, 'filled', ': ', 'Line. Width', 2); title('Function y = sin(x)/x') xlabel('x') ylabel('y') grid on Příklad: BPC 2 E_Ex 123. m
2 D grafické výstupy – doplnění (7/13) Funkce plotyy() vykreslí 2 D graf s různým rozsahem v y-ové ose, vykreslí se dvě měřítka na levé a pravé straně plotyy(x 1, y 1, x 2, y 2, style) Vykreslí grafy funkcí x 1 = f(y 1) a x 2 = f(y 2) ve stylu style x = 0. 01: 10; y 1 = log(x). *sin(3*x); y 2 = (x. ^2). *cos(2*x); figure() plotyy(x, y 1, x, y 2, 'plot') title('Functions ln(x)·sin(3 x) and x^2·cos(2 x)') xlabel('x') ylabel('y') grid on Příklad: BPC 2 E_Ex 124. m
2 D grafické výstupy – doplnění (8/13) Parametrický graf s definicí stejných měřítek na obou osách pomocí: axis equal t = 0: 0. 1: 2*pi; x = 2*t. *cos(t); y = 3*sin(t); figure() plot(x, y, 'r', 'Line. Width', 3) xlabel('x') ylabel('y') axis equal grid on Příklad: BPC 2 E_Ex 125. m
2 D grafické výstupy – doplnění (9/13) Elementární vykreslení parametrického grafu pomocí funkce ezplot()– definice spirály figure() ezplot('x*cos(x)', 'x*sin(x)', [0 5*pi]) xlabel('x') ylabel('y') grid on Příklad: BPC 2 E_Ex 126. m
2 D grafické výstupy – dopl. (10/13) Generování náhodných čísel - rovnoměrné rozdělení rand(size_of_matrix)v rozsahu 0 až 1 do matice o rozměru size_of_matrix - normální rozdělení randn(size_of_matrix) pro střední hodnotu 0 a směrodatnou odchylku 1 do matice o rozměru size_of_matrix
2 D grafické výstupy – dopl. (11/13) Tisk histogramu: hist(X, bins) vykreslí histogram vektoru X do bins intervalů, je-li X matice separátně se vykreslí histogram pro jednotlivé sloupce matice X (různou barvou) % uniform distribution lo = 100; hi = 200; u = lo + (hi-lo)*rand(10000, 1); figure() plot(u(1: 50)) figure() hist(u, 20)
2 D grafické výstupy – dopl. (12/13) % normal distribution m = 4; sd = 2; n = m + sd*randn(10000, 1); figure() plot(n(1: 50)) figure() hist(n, 40) Příklad: BPC 2 E_Ex 127. m
2 D grafické výstupy – dopl. (13/13) Funkce polar() vykreslí 2 D graf v polárních souřadnicích, nepovoluje další parametry kromě definice řetězcem s pro vizuální podobu čáry a bodu polar(x, y, s) x = 0: . 01: 2*pi; y = 1+sin(5*x). *cos(3*x); figure() polar(x, y, 'r') title('Polar graph') Příklad: BPC 2 E_Ex 128. m
Matice buněk a struktury (1/5) Matice buněk: A={cell_1_1, cell_1_2, …, cell_1_n; cell_2_1, … cell_m_n} – vygeneruje matici buněk A o rozměru mxn, přičemž každý prvek může nést různý typ proměnné – matici, vektor, skalární hodnotu různých typů nebo řetězec: >> A={[1, 2, 3; 4, 5, 6], 'Text'; 3. 45, uint 8(33)} A = [2 x 3 double] 'Text' [ 3. 45] [ 33] >> B=A{1, 1} //access to content of cell B = 1 2 3 4 5 6 – matice buněk může být i vícerozměrná nebo jen 1 rozměrná (vektor)
Matice buněk a struktury (2/5) funkce C = cell(m, n, p) vygeneruje prázdnou 3 D matici buněk C o rozměru mxnxp C=cell(3, 3, 2) C(: , 1) = [] [] [] C(: , 2) = [] [] [] >> C{1, 1, 1}='Jan' C(: , 1) = 'Jan' [] [] C(: , 2) = [] … [] [] [] [] []
Matice buněk a struktury (3/5) Příklad použití vektoru buněk (definice parametrů bodu v grafu): pink_stars = {'*', 'Line. Width', 3, 'Color', [1 0 1], 'Marker. Size', 10}; ph=0: 0. 1*pi: pi; y=sin(ph); plot(ph, y, pink_stars{: }) grid on
Matice buněk a struktury (4/5) Struktury: – podobně jako v C zapouzdření různých typů, – funkce X = struct(name_1, value_1, name_2, value_2, …… , name_N, value_N) vygeneruje strukturu o N položkách, kde name_x je jméno položky a value_x je její hodnota (nemusí být implicitně definována), přístup přes tečkovou notaci >> A=struct('Name', 'Eva', 'Age', 24, 'Income', [15234, 16428, 15998], 'Av. Income', []) A = Name: Age: Income: Av. Income: 'Eva' 24 [15234 16428 15998] []
Matice buněk a struktury (5/5) >> A. Av. Income=mean(A. Income) A = Name: Age: Income: Av. Income: 'Eva' 24 [15234 16428 15998] 15887 Názvy položek lze získat pomocí it_names = fieldnames(strukture) – vrací vektor buněk >> d=fieldnames(A) d = 'Name' 'Age' 'Income' 'Av. Income' >> d{1} ans =Name
Příkazy Matlabu (1/5) Příkazy v Matlabu mají prakticky shodný význam jako v ANSI-C. Na rozdíl od ANSI-C, je příkazový blok definován složenými závorkami, je v Matlabu uvozen klíčovým slovem příkazu (+ definice, např. testovací podmínka) a ukončen klíčovým slovem end na samostatných řádcích. Např. konstrukce for cyklu v ANSI-C int m, a = 1; for(m = 1; m <= 10; m++) { a *= m; } v Matlabu a = 1 for m = 1: 10 a = a * m; end V Matlabu se nedefinuje typ proměnné (všechny jsou matice) V Matlabu nelze použít zkrácený operátor, např. *= nebo += apod.
Příkazy Matlabu (2/5) Příkazy pro větvení: if – else – end if test_expr_1 statements_1 elseif test_expr_2 statements_2 else statements_3 end Relační operátory v podmínkách: < > <= >= == ~= Operátory < > <= >= porovnávají pouze reálnou část operandů Operátory pro slučování podmínek: && (a) || (nebo) Negace: ~
Příkazy Matlabu (3/5) switch – case – otherwise switch_expr case_expr_1 statement_1, …, statement_5 case {case_expr_2, case_expr_3, case_expr_4, …} statement_6, …, statement_13 otherwise statement_14, …, statement_21 end Pozor!!! Na rozdíl od ANSI-C po vykonání příkazů pro daný case je přepínač automaticky opuštěn (v C musí být příkaz break)
Příkazy Matlabu (4/5) Příkazy pro cykly for (pevný počet cyklů) for index = init: step: end statements_1 end for - vnořené cykly for index_s=init_s: step_s: end_s statements_s_1 for index_n=init_n: step_n: end_n statements_n end statements_s_2 end Na rozdíl od ANCI -C je inicia-li-zace (init), podmínka (end) i aktualizace (step) vždy vztažena k použitému indexu (index)
Příkazy Matlabu (5/5) while test_expr statements end Příkazy statements jsou vykonány pokud je splněna podmínka test_expr, resp. reálná část výsledku test_expr je nenulová. >> a = 8; >> b = 9; >> a < b ans = 1 >> a > b ans = 0 Cyklus do – while není v Matalbu implementován
3 D grafické výstupy (1/10) Definice pohledu na graf: view() view(az, el) se dvěma parametry definuje pohled na graf podle (úhly jsou uvažovány ve stupních): view(x, y, z) se třemi parametry definuje pohled na graf od bodu [x, y , z], velikost vektoru je bez významu
3 D grafické výstupy (2/10) plot 3 - vykreslí 3 D graf plot 3(X, Y, Z, s) kde X, Y, Z jsou vektory shodného rozměru definující souřadnice bodů grafu v osách x, y, z s je řetězec pro vizuální podobu čáry a bodu, stejné jako u funkce plot() Pro finální podobu grafu se použijí stejné funkce jako u 2 D funkce plot() Navíc popis osy z: zlabel()
3 D grafické výstupy (3/10) Parametrický 3 D graf - šroubovice t=0: 0. 1: 8*pi; x=cos(t); y=sin(t); z=t; figure() plot 3(x, y, z, 'r', 'Line. Width', 2) grid on title('x=cos(t), y=sin(t), z=t) xlabel('x') ylabel('y') zlabel('z') view(135, 25) Příklad: BPC 2 E_Ex 129. m
3 D grafické výstupy (4/10) meshgird Pro definici 3 D funkce a kreslení povrchových a síťových 3 D grafů je nutno definovat matice proměnných (např. pro osy x a y) [x, y] = meshgrid(od : krok : do) definuje matice x a y s obsahem podle následujícího příkladu: >> [x, y] = meshgrid(-3: 2: 3) x = -3 -1 1 3 y = -3 -3 -1 -1 1 1 3 3
3 D grafické výstupy (5/10) Povrchový graf surf(X, Y, Z, C) vykreslí povrchový graf Z = f(X, Y), X, Y mohou být matice vygenerované funkcí mashgrid nebo i jen vektory Z je matice výsledné 3 D funkce C definuje barevnou paletu, není-li definováno, použije se aktuální colorbar zobrazí sloupec s barevným měřítkem v ose z [x, y] = meshgrid(-5: 0. 1: 5); Z = x. ^2+y. ^2; X = x(1, : ); Y = y(: , 1);
3 D grafické výstupy (6/10) figure() %surf(x, y, Z) surf(X, Y, Z) grid on title('z=x^2+y^2') xlabel('x') ylabel('y') zlabel('z') colorbar view(135, 45) Příklad: BPC 2 E_Ex 130. m
3 D grafické výstupy (7/10) Definice barevné palety – jedna barva Paleta je obecně matice použitých barev se sloupci R, G, B v rozsahu <0, 1>, příklad jen pro červenou barvu R=1, G=0, B=0: [x, y] = meshgrid(-5: 0. 1: 5); Z = abs(x. ^2+y. ^2 -20); X = x(1, : ); Y = y(: , 1); figure() surf(X, Y, Z) grid on title('z=|x^2+y^2 -20|') xlabel('x') ylabel('y') zlabel('z') colormap([1 0 0]) Příklad: BPC 2 E_Ex 131. m
3 D grafické výstupy (8/10) Síťový graf mesh(X, Y, Z, C) – význam parametrů shodný se surf() Příklad s barevnou paletou s jednou černou barvou [x, y] = meshgrid(-4*pi: 0. 2*pi: 4*pi); Z = x. *sin(x)+y. *sin(y); X = x(1, : ); Y = y(: , 1); figure() mesh(X, Y, Z) grid on title('z=x*sin(x)+y*sin(y)') xlabel('x') ylabel('y') zlabel('z') colormap([0 0 0]) Příklad: BPC 2 E_Ex 132. m
3 D grafické výstupy (9/10) Konturový graf contour(X, Y, Z, C) – význam parametrů shodný se surf(), zobrazení 3 D grafu jako 2 D kontury [x, y] = meshgrid(-pi: 0. 05*pi: pi); Z = sin(x). ^2+cos(y). ^2; X = x(1, : ); Y = y(: , 1); figure() contour(X, Y, Z) grid on title('z=sin^2(x)+cos^2(y)') xlabel('x') ylabel('y') zlabel('z') colorbar Příklad: BPC 2 E_Ex 133. m
3 D grafické výstupy (10/10) Kombinace 3 D grafu (povrch. nebo síť. ) s 2 D konturovým surfc()a meshc() [x, y] = meshgrid(-2*pi: 0. 05*pi: 2*pi); Z = sin(x)+sin(y); X = x(1, : ); Y = y(: , 1); figure() meshc(X, Y, Z) %surfc(X, Y, Z) grid on title('z=sin(x)+sin(y)') xlabel('x') ylabel('y') zlabel('z') colormap('Winter') colorbar Příklad: BPC 2 E_Ex 134. m
DĚKUJI ZA POZORNOST Téma následující přednášky – Práce se soubory v Matlabu
- Slides: 35