8. Matlab – štruktúry
03. Júl, 2009, Autor článku: Foltin Martin, MATLAB/Comsol
Ročník 2, číslo 7
Pridať príspevok
V predošlej časti seriálu sme sa venovali formátovaniu výstupu. Dnes by sme si mali priblížiť dôležitý dátový typ a tým je štruktúra. Jej pochopenie je dôležité pre budúcu prácu s objektami a dátovým typom bunka (cell).
Štruktúra je pomerne zvláštny dátový útvar definuje v sebe pole premenných rôzneho typu. Každá položka pola však musí mať presne definovaný typ a nie je možné ich kombinovať. V rámci poľa sa však môžu kombinovať dátové typy ľubovolne. Na uvedenom príklade budeme kombinovať v štruktúre textové reťazce s celými číslami. Bez problémov by sme ale mohli začleniť do štruktúry aj vektor, alebo maticu.
Náš príklad predstavuje evidenciu kníh v knižnici. Samozrejme uloženie v štruktúre nie je tak efektívne ako keby sme vytvorili databázu, ale pre menšiu knižnicu uloženie v štruktúre postačuje. V knižnici budeme evidovať štruktúru s menom kniha. V rámci položky kniha budeme evidovať autora knihy (autor), názov diela (nazov) a rok vydania (rok_vydania). Táto štruktúra je znázornená na obr. 1.
V Matlabe máme dve možnosti ako takúto štruktúru vytvoriť. Prvým z nich je jednoduché priradenie do jednotlivých položiek.Položku od názvu štruktúry oddeľujeme bodkou.
štruktúra.položka = hodnota_položky
V našom prípade zaveďme do evidencie knihu autora Danila Charmsa, Cirkus Sardam vydanú v roku 1995.
>> kniha.autor='Danil Charms';
>> kniha.nazov='Cirkus Sardam';
>> kniha.rok_vydania=1995;
>> kniha
kniha =
autor: 'Danil Charms'
nazov: 'Cirkus Sardam'
rok_vydania: 1995
O tom koľko naša štruktúra zaberá miesta v pamäti a ako ju Matlab vníma sa presvedčíme príkazom whos.
>> whos
Name Size Bytes Class Attributes
kniha 1x1 430 struct
Druhý spôsob ako definovať štruktúru je využiť príkaz struct. Syntax príkazu je :
s = struct('field1',VALUES1,'field2',VALUES2,...)
V našom prípade by to teda znamenalo
>> kniha=struct('autor','Danil Charms',...
'nazov','Cirkus Sardam',...
'rok_vydania',1995)
kniha =
autor: 'Danil Charms'
nazov: 'Cirkus Sardam'
rok_vydania: 1995
Oba uvedené zápisy sú plne ekvivalentné.
Štruktúra v takomto tvare môže nájsť svoje miesto v istých programátorských situáciách (napr. vlastnosti objektov). Skutočná sila a význam štruktúra sa ukáže keď z v rámci štruktúry vytvoríme pole. V našom prípade by to znamenalo definovanie druhej knihy.
>> kniha(2).autor='Rob Grand';
>> kniha(2).nazov='Cerveny Trpaslik';
>> kniha(2).rok_vydania=1990;
>> kniha
kniha =
1x2 struct array with fields:
autor
nazov
rok_vydania
Vidíme, že štruktúru môžeme bez problémov indexovať a tak vytovríme celé pole obsahujúce všetky knihy v našej knižnici. Môžeme si teda štruktúru predstaviť ako kartotečné lístky na ktorých sú záznamy o jednotlivých knihách. K zvolenej knihe sa vieme dostať ak vieme jej poradové číslo v poli.
>> kniha(2)
ans =
autor: 'Rob Grand'
nazov: 'Cerveny Trpaslik'
rok_vydania: 1990
Štruktúra nám ale ponúka aj ďalší náhľad na informácie. Ak potrebujeme zistiť všetky mená autorov v knižnici, použijeme príkaz
>> kniha.autor
ans =
Danil Charms
ans =
Rob Grand
Môžeme pristupovať aj k jednotlivým pomožkám štruktúry
>> kniha(2).nazov
ans =
Cerveny Trpaslik
V prípade, že sa časom ukáže nedostatočný počet položiek, môžeme do štruktúry jednoducho doplniť novú (napr. počet strán).
>> kniha(1).pocet_stran=236
kniha =
1x2 struct array with fields:
autor
nazov
rok_vydania
pocet_stran
Táto informácia sa samozrejme dostane len k prvej knihe. Pre ostatné bude vytvorené len prázdne pole, ktoré je možné neskôr naplniť.
>> kniha.pocet_stran
ans =
236
ans =
[]
O tom ktoré položky naša štruktúra obsahuje sa dozvieme použitím príkazu fieldnames. Výstupom tohto príkazu je dátový typ cell (bunka) o ktorom sa dozviete v budúcej časti.
>> fieldnames(kniha)
ans =
'autor'
'nazov'
'rok_vydania'
'pocet_stran'
Ak by sa časom ukázalo, že sme definovali niektorú z položiek zbytočne a potrebovali by sme ju odstárniť, použijeme príkaz rmfield. Synax príkazu je
S = rmfield(S,'field')
Pre názornosť vymažme položku pocet_stran z našej štruktrúty kniha.
>> kniha=rmfield(kniha,'pocet_stran');
>> fieldnames(kniha)
ans =
'autor'
'nazov'
'rok_vydania'
Aktuálny počet evidovaných kníh môžeme zistiť príkazom length. Vidíme, že tento príkaz je použiteľný aj vo sfére štruktúr.
>> length(kniha)
ans =
2
V tomto článku sme si predstavili základné úkony, ktoré je možné so štruktúrami v Matlabe vykonávať. Podrobnejšie informácie nájdete v dokumentácii k Matlabu, alebo v nápovede. Akékoľvek otázky súvisiace s oblasťou štruktúr môžeme riešiť v diskusii pod článkom, alebo na diskusnom fóre www.matlab.sk.