Skriptų vykdymas ir duomenų valdymas Įvadas Skripto failas tai MATLAB komandų seka, vadinama programa, įrašyta į failą. Vykdant skripto failą įvykdomos jame esančios komandos. Bus kalbama, kaip sukurti skriptą, įrašyti, įvykdyti, kaip skriptui perduodami duomenys, kaip duomenis pavaizduoti ir kaip juos įrašyti apsikeitimui su kitomis programomis. Skriptų failai Lig šiol komandos būdavo įvedamos komandų lange ir paspaudus Enter klavišą įvykdomos. Tai nėra patogu, jei reikia įvykdyti ilgą komandų seką, o tuo labiau, jei reikia kažką pakeisti anksčiau vykdytose komandose. Yra kitas patogesnis būdas sukurti failą su komandų sąrašu, jį įrašyti, o tada failą įvykdyti. Komandos bus įvykdytos ta tvarka, kokia surašytos. Jei reikia, komandas galima koreguoti, failą įrašyti ir įvykdyti iš naujo. Tokie failai vadinami skriptų failais ar tiesiog skriptais. Jei skripte yra komandų, kurios generuoja kokią nors išvestį, išvestis rodoma komandų lange. Skriptų failus galima kurti bet kokiu tekstų redaktoriumi ir po to nukopijuoti į MATLAB redaktorių. Įrašant skriptų failus jiems suteikiamas plėtinys *.m, todėl MATLAB skriptų failai dar vadinami m-failais. Programoje MATLAB skriptai kuriami ir redaguojami redaktoriaus (angl. Editor) lange. Langas atidaromas pele bakstelėjus piktogramą New Script (žr. 1 pav.). 1 pav. Redaktoriaus langas. Redaktoriaus lange eilutės sunumeruojamos automatiškai. Prieš vykdymą failą reikia įrašyti, tai atliekama meniu File pasirinkus Save. Failo vardui galioja tos pačios taisyklės, kaip ir kintamajam (turi prasidėti raide, sudarytas iš raidžių, skaitmenų ir 1
pabraukimų, be tarpų, iki 63 simbolių ilgio). Kaip failo vardo nereikėtų naudoti vartotojo apibrėžtų kintamųjų, MATLAB apibrėžtų kintamųjų ar funkcijų vardų. Skripto failą galima įvykdyti tiesiai iš redaktoriaus lango pele bakstelėjus vykdymo (angl. Run) mygtuką arba komandų lange įvesti failo vardą ir paspausti klavišą Enter. Tam, kad skriptas būtų įvykdytas, jis turi būti einamajame kataloge, t. y. einamuoju reikia padaryti katalogą, kuriame yra skripto failas. Einamąjį katalogą galima pakeisti einamojo katalogo (angl. Current Folder) lange, katalogo eilutėje arba komandų lange įvedus komandą cd ir nurodžius diską bei katalogo vardą, pvz.: >> cd D:\Matlab MATLAB darbinė sritis MATLAB darbinėje srityje saugomi kintamieji, kurie buvo apibrėžti MATLAB sesijos metu. Tai apima kintamuosius, kurie buvo apibrėžti komandų lange, ir tuos, kurie buvo apibrėžti vykdant skriptus. Tai reiškia, kad komandų langas ir skriptai dalinasi ta pačia kompiuterio atmintimi. Vadinasi, jei kintamasis yra darbinėje srityje, tiek komandų lange, tiek skriptuose jis yra atpažįstamas ir gali būti naudojamas, jam galima priskirti naujas reikšmes. Informacijai apie darbinėje srityje esančius kintamuosius sužinoti yra tokios komandos: who išvardija visus atmintyje esančius kintamuosius. whos išvardija visus atmintyje esančius kintamuosius, o taip pat jų matmenis elementais, baitų skaičių bei tipą. >> 'Tekstas' ans = 'Tekstas' >> a=3 a = 3 >> b=[a*a a+2] b = 9 5 >> who Your variables are: a ans b >> whos Name Size Bytes Class Attributes a 1x1 8 double ans 1x7 14 char b 1x2 16 double Jau apibrėžtus kintamuosius galima pamatyti ir darbinės srities (angl. Workspace) lange, kuris paprastai yra dešinėje pusėje. Jei šis langas neatidarytas, jį galima atidaryti pasirinkus meniu Layout punktą Workspace. Darbinės srities langas parodytas 2 pav. 2
2 pav. Darbinės srities langas Kintamuosius darbinės srities lange galima keisti. Dukart bakstelėjus pele norimą kintamąjį, atsidaro kintamojo redagavimo (angl. Variables) langas, kuriame kintamojo turinys pavaizduotas lentele (3 pav.). Toks vaizdavimo būdas pasirinktas todėl, kad MATLAB sistemoje kintamieji yra matricos. Vadinasi galime keisti ne tik kintamojo reikšmę, bet ir keisti jo matmenis, pvz., skaliarą a paversti matrica dydžio 2 x 2. 3 pav. Kintamojo redagavimo langas. Kintamuosius darbinėje srityje galima ištrinti. Tai galima atlikti pasirinkus kintamąjį ir paspaudus klavišą Delete, paspaudus ant kintamojo dešiniuoju pelės klavišu ir kontekstiniame meniu pasirinkus punktą Delete. Kintamuosius galima ištrinti ir komandų lango komanda clear. 3
clear ištrina visus kintamuosius iš atminties. clear x y ištrina iš atminties kintamuosius x ir y. Kaip kintamųjų reikšmės patenka į skripto failą? Vykdant skripto failą, skaičiavimuose naudojami kintamieji privalo būti apibrėžti, t. y. turėti jiems priskirtas reikšmes. Kitaip tariant, jie privalo būti darbinėje srityje. Kintamiesiems reikšmes galima priskirti tokiais trimis toliau aprašytais būdais. Kintamieji apibrėžiami skripte Šiuo atveju reikšmių kintamiesiems priskyrimas yra skripto dalis. Norint įvykdyti skriptą su kitomis reikšmėmis, reikia modifikuoti skriptą, jį įrašyti ir įvykdyti iš naujo. Toliau skripto failo turinys a = 5; b = 6; suma = a + b ir komandų lange įvestos komandos. >> sumos_skaiciavimas suma = 11 Kintamieji apibrėžiami komandų lange Šiuo atveju skripto failo turinys suma = a + b ir komandų lange įvestos komandos. >> a = 5; >> b = 6; >> sumos_skaiciavimas suma = 11 Kintamieji apibrėžiami skripte, o konkrečios reikšmės priskiriamos komandų lange Šiuo atveju kintamieji aprašomi skripte, o vykdant skriptą vartotojo paprašoma komandų lange įvesti kintamojo reikšmę. Tam naudojama komanda input. Šiuo atveju skriptas: a = input('įveskite a: '); 4
b = input('įveskite b: '); suma = a + b komandų landas: >> sumos_skaiciavimas Įveskite a: 5 Įveskite b: 6 suma = 11 Komandą input galima naudoti ir tekstinėms eilutėms įvesti. Šiuo atveju tekstinę eilutę reikia rašyti tarp viengubų kabučių, arba kaip antrąjį parametrą nurodyti 's', tuomet tekstinė eilutė rašoma be kabučių. Išvedimo komandos Kaip jau matėme, įvykdžius kokią nors komandą, pvz., kintamajam priskyrus reikšmę arba įvedus anksčiau apibrėžto kintamojo vardą ir paspaudus Enter, MATLAB automatiškai sugeneruoja išvestį, t. y. komandų lange parodomas kintamojo vardas ir reikšmė. MATLAB turi ir daugiau komandų išvesčiai generuoti, dabar išsamiau apie dvi iš jų: disp ir fprintf. Šios komandos gali būti naudojamos tiek komandų lange, tiek skriptuose. Komanda disp Komanda disp naudojama kintamajam (kintamojo elementams) parodyti komandų lange. Kintamojo vardas nerodomas. Ji taip pat gali išvesti į komandų langą tekstinę eilutę. >> matrica = [1 2 3; 4 5 6]; >> disp(matrica) 1 2 3 4 5 6 >> disp('pranešimo tekstas') Pranešimo tekstas Kiekviena komanda disp informaciją išveda naujoje eilutėje. Viena komanda gali išvesti tik vieną kintamąjį. Jei reikia išvesti kelis kintamuosius, juos galima sudėti į vektorių ar matricą. Komanda disp neturi galimybių formatuoti išvesties, tekstą galima suformatuoti pridedant reikiamą kiekį tarpų. Komanda fprintf Komanda fprintf gali išvesti ne tik į komandų langą, bet ir įrašyti į failą, be to, ji gali suformatuoti išvestį. Komandos formatas: fprintf('formato eilutė', kintamasis1,..., kintamasisn) 5
Formato eilutėje gali būtų rašomas tekstas, specialūs simboliai, formatavimo elementai. Specialūs simboliai: \n - eilutės pabaigos simbolis. \t horizontalios tabuliacijos simbolis. Formatavimo elementas prasideda procento simboliu (%), jis gali būti sudarytas iš požymio, pločio ir tikslumo parametrų, konvertavimo simbolio. Privalomas tik konvertavimo simbolis. Galimos požymio reikšmės: - (minusas) skaičių išlygiuoti pagal laukelio kairį kraštą. + (pliusas) prieš skaičių rašyti ženklą (+ arba -). 0 (nulis) papildyti nuliais iš kairės, jei skaičius trumpesnis nei laukelis. Plotis ir tikslumas nurodomi skaičių pora, pvz., 5.2, kur 5 laukelio plotis (jei skaičius trumpesnis, iš kairės papildoma tarpais arba nuliais, o 2 skaitmenų skaičius po kablelio. Konvertavimo simbolio galimos reikšmės: e eksponentinis žymėjimas su mažąja raide, pvz., 1,2345e+001. E eksponentinis žymėjimas su didžiąja raide, pvz., 1,2345E+001. f fiksuoto kalblelio, pvz., 12,345. g trumpesnysis iš e ir f žymėjimų. G - trumpesnysis iš E ir f žymėjimų. i sveikas skaičius. >> a = 5; b = 292/7; c = a + b; >> fprintf('jei prie %i pridėsim %E,\ngausim %09.3f\n', a, b, c) Jei prie 5 pridėsim 4.171429E+01, gausim 00046.714 Norint tekste parašyti viengubą kabutę, reikia rašyti dvi viengubas kabutes. Jei spausdinamas kintamasis yra vektorius arba matrica, jo elementai po vieną talpinami į formatavimo elementų vietas. Jei formatavimo elementų pritrūksta, komanda kartojama tol, kol atspausdinami visi elementai. Matricos elementai imami stulpeliais. >> M = [1 2 3; 1 4 9]; >> fprintf('skaičius lygus %i, jo kvadratas lygus %i\n', M) Skaičius lygus 1, jo kvadratas lygus 1 Skaičius lygus 2, jo kvadratas lygus 4 Skaičius lygus 3, jo kvadratas lygus 9 Rašymas į failą komanda fprintf Prieš rašant į failą, failą reikia atidaryti komanda: fid = fopen( failovardas, teisės ) Čia fid failo identifikatorius. Atidarius failą jam priskiriama skaliarinė reikšmė. Galimos teisės: 'r' atidaryti failą skaitymui (numatytoji reikšmė). 6
'w' atidaryti failą rašymui. Jei failas jau egzistuoja, jo turinys ištrinamas. Jei failas neegzistuoja, jis sukuriamas. 'a' atidaryti failą rašymui. Jei failas jau egzistuoja, rašoma į failo pabaigą. Jei failas neegzistuoja, jis sukuriamas. 'r+' atidaryti failą skaitymui ir rašymui. 'w+' atidaryti failą skaitymui ir rašymui. Jei failas jau egzistuoja, jo turinys ištrinamas. Jei failas neegzistuoja, jis sukuriamas. 'a' atidaryti failą skaitymui ir rašymui. Jei failas jau egzistuoja, rašoma į failo pabaigą. Jei failas neegzistuoja, jis sukuriamas. Jei teisės nenurodytos, failas atidaromas su numatytąja reikšme 'r'. Į failą rašoma komanda fprintf, tačiau pirmuoju kintamuoju nurodomas failo identifikatorius. Baigus rašyti failas uždaromas komanda fclose(fid). >> a = 5; b = 292/7; c = a + b; >> fid = fopen('sumos_failas.txt', 'w') fid = 3 >> fprintf(fid, 'Jei prie %i pridėsim %E,\ngausim %09.3f\n', a, b, c) ans = 51 >> fclose(fid) ans = 0 Įvykdžius aukščiau pateiktas komandas einamajame kataloge bus sukurtas failas sumos_failas.txt, o jame bus tokia informacija: Jei prie 5 pridėsim 4.171429E+01, gausim 00046.714 Komandos save ir load Komandos save ir load naudojamos darbinėje srityje esantiems kintamiesiems įrašyti į failą ir nuskaityti iš failo. Tai naudinga pernešant duomenis iš vienos platformos kompiuterio, pvz., Windows, į kitą platformą, pvz., OS X. Šios komandos taip pat gali būti naudojamos apsikeičiant duomenimis su kitomis programomis. Komanda save Šios komandos gali būti rašomos dviem būdais su skliaustais ir be jų. Abu variantai veikia vienodai, toliau pateiksime abu variantus. Komandos save failovardas save('failovardas') įrašo visus darbinės srities kintamuosius į failovardas.mat, o komandos einamojo katalogo failą 7
save failovardas kintamasis1... kintamasisn save('failovardas', kintamasis1,..., kintamasisn) tik nurodytus kintamuosius. Failai su plėtiniu *.mat yra dvejetainiai failai, kiekvienam kintamajam išsaugomas jo vardas, tipas, dydis ir reikšmė. Šie failai neskirti skaityti su kitomis programomis. Šiam tikslui duomenis reiktų įrašyti tekstiniu formatu nurodant raktą ascii. Tekstiniuose failuose kintamųjų vardai, tipai ir dydžiai nėra išsaugomi. Reikšmės atskiriamos tarpais. Įvykdžius >> A = [1/3 1/7 1/9; 1/11 1/13 1/15]; >> V = [pi pi/2 pi/3 pi/4]; >> save -ascii save_failas bus sukurtas failas save_failas (be plėtinio), su tokia informacija: 3.3333333e-01 1.4285714e-01 1.1111111e-01 9.0909091e-02 7.6923077e-02 6.6666667e-02 3.1415927e+00 1.5707963e+00 1.0471976e+00 7.8539816e-01 Komanda load Komanda load veikia priešingai komandai save, t. y. ji nuskaito duomenis iš failo. Jos galimi formatai: load failovardas load('failovardas') load failovardas kintamasis1... kintamasisn load('failovardas', kintamasis1,..., kintamasisn) Komanda load gali nuskaityti duomenis ir iš failo, įrašyto su raktu ascii arba iš kitos programos sukurto failo, tačiau šie duomenys gali būti priskirti tik vienam kintamajam. Tai reiškia, kad duomenys turi atitikti skaliaro, vektoriaus arba matricos pavidalą. Aukščiau pateiktame pavyzdyje pateiktų duomenų nuskaityti nepavyktų, nes paskutinėje eilutės stulpelių skaičius nesutampa su stulpelių skaičiumi pirmose dviejose eilutėse. Be to, iš tekstinio failo nuskaitytus duomenis reikia priskirti kokiam nors kintamajam. Komanda load failovardas duomenis priskirs kintamajam failovardas, todėl patogiau naudoti kitą komandos pavidalą: kintamasis = load('failovardas') 8
Duomenų importavimas ir eksportavimas MATLAB dažnai naudojama kitų programų sukurtiems duomenims analizuoti, tam reikia duomenis pirmiausiai importuoti. Gali būti ir priešingas poreikis, t. y. MATLAB duomenis apdoroti kitomis programomis. Tam duomenys eksportuojami. Duomenis importuoti galima komandomis arba naudojant importavimo vedlį. Apsikeitimas duomenimis su Excel Viena iš dažnesnių programų, su kuria tenka keistis duomenimis tai Microsoft Excel. Duomenys importuojami iš Excel lentelės komanda kintamasis = xlsread('failovardas', 'lapovardas', 'diapazonas') Jei nenurodytas Excel lentelės skirtuku pažymėto lapo vardas, importuojama tik iš pirmojo. Jei nenurodytas diapazonas, importuojamas visas lapas. Diapazonas nurodomas priešingų stačiakampės srities kampų koordinatėmis, pvz., 'B2:D5'. Tarkime turime Excel lentelę, kaip pavaizduota 4 pav. 4 pav. Excel lentelė. Šie duomenys importuojami taip: >> DUOM = xlsread('book1', 'Sheet2', 'B2:D3') DUOM = 9 8 7 6 5 4 Duomenims atgal į Excel lentelę galima įvykdyti komandą 9
>> xlswrite('book1', DUOM, 'Sheet2', 'B2:D3') Importavimo vedlys Naudojimasis Importavimo vedliu yra bene paprasčiausias būdas duomenims į MATLAB importuoti, nes vartotojui nebūtina žinoti ir nurodyti duomenų formatą. Vedlys aktyvuojamas pasirinkus piktogramą Import Data arba komandų lange įvedus komandą uiimport. Paleidus vedlį atsidaro failų pasirinkimo langas. Pasirinkus failą ir paspaudus Open, vedlys atidaro failą ir parodo porciją duomenų peržiūrai. Tarkime, kad ankstesniame pavyzdyje naudotą Excel lentelę įrašėme tekstiniu formatu Text (Tab delimited) ir gavome failą Book1.txt. Vedlio lange atidarytas šis failas pavaizduotas 5 pav. 5 pav. Importavimo vedlio langas. Vartotojas gali pasirinkti skirtukus, duomenų diapazoną, kintamojo vardą ir pan. Pasirinkus išvesties tipą (angl. Output Type) Numeric Matrix ir paspaudus mygtuką Import Selection Import Data duomenys importuojami ir priskiriami kintamajam Book1. Tuo galima įsitikinti komandų lange: >> Book1 Book1 = 9 8 7 6 5 4 Literatūra 1. Gilat, A. (2011). MATLAB: an introduction with applications. 4 th Edition. John Willey & Sons, Inc. (20-24,95-117 psl.) 10