6. Matlab – znaky a textové reťazce

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

V tretej časti nášho seriálu o Matlabe sme si popísali dátové typy, ktoré Matlab využíva. V krátkosti sme si povedali o znakových premenných a ako znakovú premennú vytvoríme. Dnes si znaky a textové reťazce popíšeme detailnejšie a ukážeme základnú prácu s nimi. Uvedieme aj zopár užitočných príkazov, ktoré pravdepodobne budete využívať pri manipulácii so znakovými a textovými premennými.

Znak je v Matlabe reprezentovaný ako celočíselná hodnota konvertovaná na jej Unicode znakový ekvivalent. Na deklarovanie znaku využijeme apostrofy, medzi ktoré napíšeme požadovaný znak. Základné znaky sú reprezentované číslami 32 – 127. Čísla menšie ako 32 sú netlačiteľné riadiace znaky. Ďalšie čísla reprezentujú znaky rôznych fontov na počítači. Číselnú hodnotu znaku môžeme potom získať napríklad príkazom uint8.

>>znak='P';
>>cislo=uint8(znak);
cislo=80

Matlab po zadaní týchto príkazov uloží do premennej znak písmeno P a do premennej cislo jeho číselný ekvivalent (v našom prípade číslo 80). Textové premenné, sa podobne ako znakové, deklarujú pomocou apostrofov. Text je uložený ako pole znakov. Číselné hodnoty jednotlivých znakov znova získame napríklad pomocou príkazu uint8. Čísla možeme konvertovať na znaky alebo textové reťazce pomocou príkazu char.

>>retazec='Hello';
>>cisla=uint8(retazec);
cisla=[72 101 108 108 111]

>>portal=char([80 111 115 116 101 114 117 115]);
portal=Posterus

V premennej portal nájdete textový reťazec s menom nášho portálu. Spojenie reťazcov do jedného riadku môžeme urobiť pomocou hranatých zátvoriek a znaky, alebo reťazce oddeliť čiarkou, alebo medzerou. Spojenie v riadku môžeme urobiť aj pomocou príkazu strcat.

>>spolu1=[retazec, ' ', portal,'!'];
spolu1=Hello Posterus!

Spojenie reťazcov v stĺpci sa robí podobne ako v predchádzajúcom príkaze, ale namiesto čiarky použijeme bodkočiarku. Pri vytváraní polí znakov treba dávať pozor nato, aby mali jednotlivé riadky rovnaký počet znakov. Konce krátkych znakov môžete dopĺňať medzerami. Príkaz char doplní prázdne znaky za vás. Na vertikálne spojenie textových reťazcov môžeme použiť príkaz strvcat.

>>spolu2=[retazec; portal]; %tento príkaz vyhlási chybu!
>>spolu2=['Hello   ';'Posterus'];
spolu2=
Hello    %za reťazcom sú ešte 3 medzery
Posterus

spolu3=char('Hello','Posterus');
spolu2=
Hello    %za reťazcom sú ešte 3 medzery
Posterus

Pomocou príkazu blanks môžeme vytvoriť prázdny reťazec s daným počtom medzier namiesto toho, aby sme museli stláčať niekoľko krát medzeru. Pre lepšiu názornosť ohraničíme prázdne znaky lomítkom

>>textblank=blanks(10);
>>text=['|',textblank,'|']
text=|          |

Znaky do reťazca môžeme vložiť aj pomocou maticových indexov. Prázdne miesta na začiatku a konci textového reťazca odstránime pomocou funkcie strtrim

>>textblank=blanks(10);
>>textblank(3:8)='Matlab'
>>text=['|',textblank,'|'];
text=|  Matlab  |

>>texttrim=strtrim(textblank);
>>text=['|',texttrim,'|']
text=|Matlab|

Zhrnutie príkazov na tvorbu textových reťazcov najdete v nasledujúcej tabuľke.

Funkcia Popis
‘str’ vytvorí znakové pole medzi apostrofmi
blanks vytvorí pole medzier
strcat spája znakové polia
strvcat spája znakové polia vertikálne

Tab. Príkazy na vytvorenie poľa znakov

Textový reťazec môžeme skontrolovať po znakoch, či obsahuje určítú sadu znakov. Väčšinou sa kontroluje, či textový reťazec obsahuje písmená, čísla, medzery alebo nejaké iné špeciálne znaky. Na nasledujúcich príkladoch si ukážeme hľadanie medzery a špeciálnych znakov.

>>text='Hello Posterus';
>>je=isspace(text);
je=[0 0 0 0 0 1 0 0 0 0 0 0 0 0]

>>je2=isstrprop(text,'upper');
je2=[1 0 0 0 0 0 1 0 0 0 0 0 0 0]

>>num2=[9 72 101 108 108 111 32 80 111 115 116 101 114 117 115 10];
>>str2=char(num2);
>>isstrprop(str2,'wspace');

Posledný príkaz vráti v našom prípade hodnotu 1 na pozíciach kde sú čisla 9, 32 a 10, čo su znaky tabulátora, medzery a nového riadku. Znaky alebo reťazce môžeme identifikovať pomocou príkazov v nasledujúcej tabuľke.

Funkcia Popis
ischar vyhodnotí, či je argument pole znakov
isletter testuje jednotlivé znaky na písmená
isspace testuje jednotlivé znaky na medzery
isstrprop testuje jednotlivé znaky na vlastnosti (zadávajú sa ako retazec, viac manuál)

Tab. Príkazy na identifikáciu znakov alebo textových reťazcov

Často sa stáva, že v našom reťazci znakov potrebujeme nájsť nejaký kratší reťazec, prípadne porovnať či sa náš reťazec zhoduje s nejakým iným. Matlab má pripravených zopár príkazov na hľadanie a porovnávanie textových reťazcov. Z nich si ukážeme príkazy na vyhľadanie reťazca, porovnanie reťazcov a nájdenie tokena v reťazci.

>>text='Posterus';
>>kde=strfind(text,'s');
kde=[3 8] %pozícia písmena s v premennej text

>>rovne=strcmpi(text,'POSTERUS');
rovna=1 %reťazce sa zhodujú ingnorujeme veľke a malé písmená

>>je=strncmp(text,'Post',4);
je=1 %na prvých 4 znakoch je textový reťazec Post

>>datum='12/06/2009';
>>[token,zvysok]=strtok(datum,'/');
token=12, zvysok=/06/2009
>>[token2,zvysok]=strtok(zvysok,'/')
token2=06, zvysok=/2009
>>[token3,zvysok]=strtok(zvysok,'/')
token3=2009, zvysok=Empty string: 1-by-0

V nasledujúcej tabuľke uvádzame ďalšie príkazy na hľadanie a porovnávanie reťazcov

Funkcia Popis
findstr hľadá pole znakov v druhom poli znakov
strcmp porovnáva polia znakov
strcmpi porovnáva polia znakov, ignoruje veľkosť znakov
strmatch hľadá zadané pole znakov na začiatku iných polí znakov
strncmp hľadá znakové pole v prvých N znakoch iného znakového poľa
strncmpi hľadá znakové pole v prvých N znakoch iného poľa, ignoruje veľkosť
strtok nájde token v poli znakov

Tab. Príkazy na hľadanie alebo porovnavanie polí znakov

Ďalšia sada príkazov robí zmeny v textových reťazcoch. Vyúživajú sa keď chceme náš textový reťazec upraviť do našej želanej podoby. V nasledujúcich príkazoch si ukážeme postupne odstránenie prázdnych miest, zmenu veľkosti písma, usporiadanie textu a nahradenie poľa znakov iným poľom.

>>text='Posterus  '
>>text2=deblank(text);
text2=Posterus %odstráni zbytočné medzery na konci

>>text3=upper(text2);
text3=POSTERUS

>>text4=sort(text3);
text4=EOPRSSTU

>>text5='12/06/2009';
>>text6=strrep(text,'/','.');
text6=12.06.2009;

Prehľad ďalších príkazov, ktorá sa daju využiť na úpravu vašich reťazcov.

Funkcia Popis
deblank odstaňuje prázdne miesta
lower zmení všetky písmená na malé
sort usporiadava znaky zostupne alebo vzostupne
strjust zarovná pole znakov
strrep nahradí pole znakov iným poľom
strtrim odstráni prázdne znaky na začiatku alebo na konci poľa znakov
upper zmení všetky písmená na veľké

Tab. Príkazy na zmenu polí znakov

Matlab dokáže konvertovať číslo, ktoré je uložené ako textový reťazec priamo na požadovaný číselný dátový typ. Samozrejme, že to ide aj opačne, teda vieme konvertovať číslo, dokonca aj maticu na textový reťazec.

>>cislo=1.234;
>>text=num2str(cislo);
text=1.234 %premenná text je textový reťazec

>>matica=[1,2;3,4];
>> text=mat2str(matica);
text=[1 2;3 4] %premenná text je textový reťazec

>>str = '37.294e-1';
>> cislo=str2double(str);
cislo=3.7294 %číslo je dátový typ s pohyblivou čiarkou

V nasledujúcej tabuľke je súhrn príkazov na prevod medzi číslami a textovými reťazcami a naopak. Niektoré sme si už ukázali v úvode tohoto článku.

Funkcia Popis
char konvertuje na znakové pole
double konvertuje pole znakov na číselné hodnoty
int2str konvertuje celé číslo na znakové pole
mat2str konvertuje maticu na znakové polia
num2str konvertuje číslo na znakové pole
str2num konvertuje znakové pole na číselnú hodnotu
str2double konvertuje znakové pole na číslo s pohyblivou čiarkou

Tab. Príkazy na prevod medzi číselnými a znakovými typmi

V tejto časti sme si popísali základnú prácu so znakmi a textovými reťazcami. V nasledujúcej časti si ukážeme ako naformátovať výstup v Matlabe.

Napísať príspevok