7. Matlab – formátovaný výstup v Matlabe

26. Jún, 2009, Autor článku: Blaho Michal, MATLAB/Comsol
Ročník 2, číslo 6 This page as PDF Pridať príspevok

V predchádzajúcej časti nášho seriálu o Matlabe sme si popisovali znaky a textové reťazce. Výstup výsledkov môžeme formátovať v príkazovom riadku (Command Window) pomocou niekoľkých typov formátov. Medzivýsledok môžeme naformátovať aj pomocou príkazov, ktoré vrátia výsledok ako textový reťazec.

Formát v príkazovom riadku

Ako už bolo spomenuté, v príkazovom riadku (Command Window) dokážeme zmeniť formát výstupu. Treba dbať nato, že meníme len formát zobrazovania výsledku a nie ako ho Matlab ukladá. Na zmenu formátu výsledku slúži príkaz format. Príkaz má nasledujúci zápis:

>>format typ
>>format('typ');

V naledujúcej tabuľke sa nachádzajú rôzne druhy formátov pričom ich výstup si ukážeme na Ludolfolom čísle pi. Tabuľka obsahuje formáty pre čísla s pohyblivou čiarkou.

Formát Popis Výsledok
short zmenšené číslo so 4 číslami za desatinnou čiarkou 3.1416
long zmenšené číslo so 14 alebo 15 číslami za desatinnou čiarkou pre typ double a so 7 číslami pre typ single 3.141592653589793
short e formát čísla s pohyblivou čiarkou so 4 číslami za desatinnou čiarkou 3.1416e+00
long e formát čísla s pohyblivou čiarkou so 14 alebo 15 číslami za desatinnou čiarkou pre typ double a so 7 číslami pre typ single 3.141592653589793e+00
short g lepšie z čísel v pevnej rádovej čiarke alebo v pohyblivej rádovej čiarke so 4 číslami za desatinnou čiarkou 3.1416
long g lepšie z čísel v pevnej rádovej čiarke alebo v pohyblivej rádovej čiarke so 14 alebo 15 číslami za desatinnou čiarkou pre typ double a so 7 číslami pre typ single 3.14159265358979
short eng číslo v inžinierskom formáte s presne 4 číslami za desatinnou čiarkou a s 3 číslami v mocnine 3.1416e+000
long eng číslo v inžinierskom formáte s presne 16 číslami za desatinnou čiarkou a s 3 číslami v mocnine 3.14159265358979e+000

Tab.1 Formát pre čísla s pohyblivou čiarkou

Ďalšie formáty v nasledujúcej tabuľke slúžia pre všetký číselné typy.

Formát Popis Výsledok
+ vracia znamienko čísla +, -, prázdne miesto
bank menový formát, 2 čísla za desatinnou čiarkou (pozn. pri dlhých čísla môže vracať zlý vysledok) 3.14
hex hexadecimálna (šestnástková) reprezentácia binárneho čísla s dvojitou presnosťou za desatinnou čiarkou. 400921fb54442d18
rat číslo vo formáte zlomku pre malé celočísla 355/113

Tab.2 Ďalšie formáty pre číselné typy

Zvyšné formáty upravujú medzery vo výsledku. Pred použitím sme zadali formát short.

Formát Popis Výsledok
compact odstraňuje medzery z príkazového riadku, aby sa zmestilo viac výsledkov >> pi
ans =
3.1416
loose pridáva medzi výsledok medzery, aby sa výsledok dal čítať ľahšie >> pi

ans =

3.1416

Tab.3 Formátovanie medzier vo výsledku

Formát v príkazovom riadku si môžeme zmeniť aj pomocou horného menu vo File > Preferences > Command Window. Pre získanie aktuálne nastaveného formátu môžeme použiť príkaz get s parametrom Format a na zistenie zobrazovania medzrier parameter FormatSpacing ako je to v nasledujúcom príklade.

>>format long
>>format compact
>>get(0,'Format');
ans = long
>>get(0,'FormatSpacing').
ans = compact

Formátovanie textového reťazca

Matlab poskytuje niekoľko funkcií, ktoré dokážu poskladať textový reťazec z obyčajného textu a iných dát (napriklad čísla, biele znaky, atď.). Formátovanie je podobné formátovaniu vo funkcii printf v programovacom jazyku C. V nasledujúcej tabuľke sú funkcie, ktoré dokázu formátovať reťazec.

Funkcia Popis
sprintf zapisuje formátovaný text do textovej premennej
fprintf zapisuje formátovaný text do súboru alebo Command Window
warning zobrazuje formátovaný text ako upozornenie
error zobrazuje formátovaný text ako chybu a skončí vykonávanie programu
assert vyhlási chybu pri nedodržaní podmienky

Tab.4 Formátovanie textu vo funkciách

Hlavnou časťou argumentov funkcií je formátovaný text a hodnoty, ktoré sú doplnené do textu. Príkazy maju teda nasledujúcu štruktúru

>>príkaz(param,formáovaný text,hodnota1,...,hodnotaN)

Formátovaný text je uzatvorený do apostrofov. Formátovaný text sa skladá z niekoľkých častí: obyčajného textu, špeciálnych znakov a formátovacích operátorov. Jednotlivé časti si detailne popíšeme. Obyčajný text sú znakové reťazce, ktoré bežne zadávame. Špeciálne znaky sú znaky textového reťazca, ktoré sa nedajú zadať priamo (pretože majú aj iný význam). Preto ich musíme zadavát pomocou nasledujúcich znakov v ďalšej tabuľke.

Popis znaku Zadávame ako
apostrof
znak percenta %%
lomítko \\
backspace \b
posun formulára \f
nový riadok \n
carriege return \r
tabulátor \t
šestnástkové číslo N \xN
osmičkové číslo N \N

Tab.5 Špeciálne znaky

Formátovacie operátory hovoria ako má Matlab naformátovať dátové argumenty a kde ich má zapísať do textu. Formátovací oprátor začína znakom percenta a pokračuje ďalšími časťami, ktoré si popíšeme. Zapisujú sa v tomto poradí:

  • Identifikátor – poradové číslo dátového argumentu
  • Prepínač – kontroluje zarovnanie a vloženie znaku plus a mínus
  • Dĺžka poľa – minimálny počet znakov na zobrazenie
  • Presnosť – počet znakov za desatinnou čiarkou
  • Podtyp – špecifikuje neštandardné typy
  • Znak konverzie – špecifikuje notáciu výstupu

Všetky časti si popíšeme a ukážeme na príkladoch. Znak konverzie špecifikuje notáciu výstupu. Je to posledný znak oprátora a je jediný, ktorý musí byť zadaný. V nasledujúcej tabuľke sú všetky znaky na konverziu.

Znak Popis
c jeden znak
d celé číslo (so znamienkom)
e číslo v exponenciálnom tvare
E číslo v exponenciálnom tvare s veľkým E v exponente
f číslo s pevnou rádovou čiarkou
g kompaktnejšie ako %e alebo %f
G ako %g, ale s veľkým E v exponente
o osmičkové číslo (bez znamienka)
s textový reťazec
u celé číslo (bez znamienka)
x šestnástkové číslo (malé písmená a-f)
X šestnástkové číslo (veľké písmená A-F)

Tab.6 Znaky konverzie

Nasledujúci príklad ukazuje zapísanie čísla 46 v rôznych dátových typoch.

>>sprintf('Číslo 46: %d, %f, %e, %X',46,46,46,46);
Číslo 46: 46, 46.000000, 4.600000e+01, 2E.

Podtyp je znak, ktorý sa môže dať pred znakom konverzie. Podporujú ho len niektoré typy ako %o, %u, %x a %X.

Znak Popis
b základný typ v jazyku C je skôr double ako celé číslo bez znamienka
t základný typ v jazyku C je skôr float ako celé číslo bez znamienka

Tab.7 Podtyp

Podtyp teda hovorí Matlabu, že má číslo reprezentovať skôr ako číslo s dvojnásobnou presnosťou ako celé číslo bez znamienka. Presnosť je nezáporné celé číslo, ktoré hovorí koľko čísiel sa má nachádzat za desatinnou čiarkou. Pred presnosť treba dať vždy bodku.

>>sprintf('Presnosť: %.2g, %f, %.2f.',46*pi,46*pi,46*pi)
Presnosť: 1.4e+02, 144.513262, 144.51.

Dĺžka poľa určuje koľko bude mať dátový argument minimálny počet znakov, preto to musí byť kladné celé číslo. Ak je číslo väčšie ako počet znakov čísla, ktoré chceme zobraziť, zvyšné polia sa vyplnia medzerami.

>>sprintf('|%e|%15e|%f|%15f|',46*pi,46*pi,46*pi,46*pi)
|1e+02|   1.445133e+02|144.513262|     144.513262|

Prepínačom môžeme zarovnať výstup, zobrazit znamienko alebo vyplniť medzery nulami. V nasledujúcej tabuľke sú vypísané prepínače.

Znak Popis
znak mínus (-) zarovnanie doľava
znak plus (+) zobrazenie znamienka
0 dopĺňa nulu namiesto medzier pred dátami

Tab.8 Prepínače

Znaky môžeme medzi sebou aj kombinovať. Nasledujúce príklady ozrejmia ich použitie.

>>sprintf('|%6.2f|%-6.2f|',pi,pi)
|  3.14|3.14  |
>>sprintf('|%+6.2f|%-+6.2f|',pi,pi)
| +3.14|+3.14 |
>>sprintf('|%06.2f|%-06.2f|',pi,pi)
|003.14|3.14  |

Matlab dosadzuje dátové premenné do textu v poradí v akom sú zadané. Môžeme mu však sami povedať v akom poradí ich má dosadiť do textu. Poradie určuje číslo za znakom percenta, za ktorým nasleduje symbol dolára $.

>>sprintf('%s %s %s','a','b','c')
a b c
>>sprintf('%3$s %2$s %1$s','a','b','c')
c b a

Matlab neumožňuje usporiadať iba časť dátových premenných. Ak by sme všetkým dátovým premenným nepriradili poradie vypísal by chybu. Pre formátovanie dĺžky a presnosti platí zopár pravidiel, ktoré si uvedieme.

  • ak nie je daná presnosť je štandardne 6
  • ak je presnosť (p) menšia ako počet čísel za desatinnou čiarkou zobrazí sa len p čísel a zvyšok je zaokrúhlený
  • ak je presnosť (p) väčšia ako počet čísel za desatinnou čiarkou zobrazí sa len p čísel a zvyšok je doplnený nulami
  • ak nie je daná dĺžka poľa je štandardne nastavená ako presnosť plus 1 plus počet číslic pred desatinnou čiarkou
  • ak dĺžka poľa (w) je viac ako p+1 plus počet číslic pred desatinnou čiarkou je reťazec rozšírený o w-(n+p+1) medzier alebo núl v závislosti od prepínača.

Dĺžku poľa a presnosť môžeme určiť aj vstupnými agrumentami tak, že namiesto čísla dĺžky a presnosti dáme symbol hviezdičky *. Viac nám bude zrejmé z príkladu.

>>sprintf('Moje pi: %0*.*f',8,4,pi)
Moje pi: 003.1416

Dnes sme si teda ukázali ako dokážeme Matlabu povedať, aby nám zobrazoval výsledok v požadovanom formáte a ako si sami naformátujeme textový reťazec na základe dátových vstupov. Formátovaný text potom využijeme v ďalších funkciach, ktoré ako vstup požadujú textový reťazec. V nasledujúcej časti si popíšeme doležitý dátový typ a tým je štruktúra.

Napísať príspevok