24. Matlab – Import a Export MAT-súborov
21. Máj, 2010, Autor článku: Blaho Michal, MATLAB/Comsol
Ročník 3, číslo 5
Pridať príspevok
Na konci minulej časti sme si naznačili čo je import a export dát. Ukázali sme si aké typy súborov môžeme pomocou Matlabu importovať a exportovať. Dnes si popíšeme ako môžeme pracovať so štandardnými dátovými súbormi Matlabu MAT-súbormi.
MAT-súbory sú binárne súbory s dvojitou presnosťou. Predstavujú štandardný formát súborov na ukladanie dát v Matlabe. Dáta uložené v MAT-súbore je možné prenášať a čítať na ďalšom počítači s rovnakou (často aj s rôznou) verziou Matlabu.
Export do MAT-súborov
Na exportovanie premenných z Workspace do binárneho súboru sa využíva funkcia save. Za menom funkcie sa uvádza meno súboru. Ak sa meno nezadá Matlab uloží dáta do súboru matlab.mat. Za menom súboru vymenúvame premenné, ktoré chceme uložiť. Ak nešpecifikujeme premenné Matlab uloží do súbora všetky premenné Workspace.
>>save menosubora
>>save menosubora prem1 prem2 … premN
Ak chceme uložiť premenné, ktoré sa začínajú rovnakými znakmi nemusíme ich jednotlivo vymenovať. Stačí ak použijeme špeciálny znak (wildcard character) *. V ďalšom príklade si ukážeme ako zapísať druhý príkaz z prvého príkladu práve pomocou špeciálneho znaku. Obsah súbora bez jeho importu si pozrieme príkazom whos s prepínačom file, za ktorým nasleduje meno súboru.
>>save menosubora prem*
>>whos -file menosubora
Ako sme si už spomínali v inej časti štruktúra je akýmsi poľom premenných rôzneho typu. Matlab umožňuje uložiť štruktúru ako jedinečnú premennú, alebo uložiť jednotlivé položky štruktúry ako samostatné premenné v súbore. Ak chceme položky uložiť samostatne musíme použiť prepínač struct.
>>S.a=10.0;
>>S.b='Posterus';
>>save mojastruktura.mat S
>>save mojedata.mat -struct S
>>save mojedata.mat -struct S b
Na prvých dvoch riadkoch sme si vytvorili jednoduchú štruktúru. Na treťom riadku sme do dátového súboru uložili celú štruktúru. Na ďalšom sme uložili do súboru štruktúru, ale ako jednotlivé položky. Posledným príkazom sme Matlabu povedali, že chceme uložiť iba položku b zo štruktúry S. Do dátového súbora môžeme pridávať ďalšie premenné. Dokážeme to pomocou prepínača append. Podľa toho či sa už daná premenná nachádza v súbore alebo nie Matlab vykoná nasledovné operácie:
- premenná už v súbore je – Matlab prepíše uložené údaje aktuálnymi vo Workspace!!!
- premenná v súbore nie je – Matlab pridá premennú a uloží jej údaje z Workspace
Treba si uvedomiť, že Matlab existujúce premenné nedopĺňa, ale prepisuje. Môže to viesť ku chybám, ktoré sa ťažko hľadajú. Pri veľkých dátach Matlab dovoľuje využívať kompresiu. Kompresiu zapneme prepínačom v6. Kompresia je vhodná pre veľké objemy dát. Problémom je, že uloženie a načítanie dát s kompresiou trvá dlhší čas. Keď nechceme ukladať dáta binárne môžeme použiť prepínač ascii. Komplexné čísla je vhodné rozdeliť do dvojrozmerného poľa, pretože by sa pri ukladaní stratila imaginárna časť (Matlab nedokáže načítať nečíselné dáta ‘i’). Ukladané dáta by mali mať rovnaký rozmer (dvojrozmerné polia), lebo pri ascii prepínači sa ukladajú iba ako jedna premenná a spôsobilo to problémy pri načítaní. Preto sa odporúča ukladať textovo za každým iba jednu premennú.
>>save menosubora -v6
>>save filename -ascii prem1
Import z MAT-súborov
Ak ste zvládli export do MAT-súborov import vám nebude robiť žiadne problémy. Načítanie dát zo MAT-súborov do Workspace urobíme pomocou príkazu load. Väčšina syntaxe je rovnaká ako pri exporte. Ak chceme načítať celý súbor do Workspace uvedieme len jeho meno. Podobne ako pri exporte môžeme importovať vybrané premenná, prípadne využiť špeciálny znak *.
>>load menosubora
>>load menosubora prem1 prem2 … premN
>>load menosubora prem*
Skôr ako dáta načítame dáta môžeme si ich pozrieť príkazom whos s prepínačom file a menom súbora. Uvidíme tak informácie ako sú mená premenných, ich rozmer alebo triedu (typ) premennej. Špecifikovaním výstupnej premennej funkcie load určujeme premennú do ktorej sa načítajú všetky dáta naraz. Táto premenná bude logicky typu štruktúra.
>>whos -file menosubora.mat
>>S = load('menosubora.mat')
Pri čítaní textových (ASCII) dát musia byť dáta uložené s rovnakým počtom dát v riadku (inak hlási Matlab chybu). Dáta by mali byť oddelené prázdnym miestom, čiarkou alebo tabulátorom. Počet riadkov premennej sa bude rovnať počtu riadkov v súbore. Meno premennej sa bude štandardne rovnať menu súboru, z ktorého dáta čítame bez prípony. Ak by sa súbor začínal podtrhovníkom alebo číslom Matlab doplní pred premennú písmeno X.
V dnešnej časti sme si ukázali prácu so štandardnými súbormi Matlabu MAT-súbormi. Po dnešnej časti by ste mali byť schopní ukladať a čítať dáta s MAT-súborov. Ďalšie možnosti čítania a zápisu dát do MAT-súborov nájdete v užívateľskej príručke. V nasledujúcej časti sa pozrieme na prácu s klasickými textovými súbormi.
12. Apríl, 2011 o 17:27
Dobry den. Mam taky problem. Robim na funkcii ktorá načíta *.MAT súbor, v ktorom je uložená štruktúra ktorá obsahuje okolo 5000 záznamov a potrebujem ju teda načítať a ďalej s ňou pracovať, len mi vždy vypíše, že :
??? Undefined variable “test_info” or class “test_info”.
Error in ==> get_wav_info at 24
x = size(test_info(i,1).phn_mtx);
Error in ==> get_stat at 155
stat(i,1).test_mtx = get_wav_info(pocet_hlasok, i);
Normálne ten MAT súbor loadujem ako load(‘test_info.mat’); a vo funkcii volám ďalšiu funkciu v ktorej sa má vykonať toto :
x = size(test_info(i,1).phn_mtx);
…neviem čo by som s tým mal urobiť aby som ten MAT súbor videl aj v tejto vnorenej funkcii. Za rady ďakujem
13. Apríl, 2011 o 13:40
to by chcelo vidiet aj subor aj program, skuste mi ho poslat na mail co je uvedeny v O webe