5. Előadás Matlab függvények, adatfeldolgozás, állományok kezelése. Salamon Júlia Előadás I. éves mérnök hallgatók számára
Matlab függvények A Matlab rendszer függvényekből épül fel. A Matlab interpreter a függvénynév megjelenésekor elkezdi keresni a megadott nevű fájlt a háttértáron, ha nem találja, akkor hibát jelez. A keresés sorrendje a következő: keresi a változók között; keresi a rendszerbe beépített függvények között; keresi aktuális könyvtárban m kiterjesztésű állományként; végig nézi a Matlab installációjában megadott útvonallal elérhető könyvtárakat. A rendszerbe beépített függvények listáját nem lehet megnézni, viszont az m- fájlban tárolt függvények programlistája tanulmányozható és módosítható is. Ha olyan függvényt szeretnénk használni, amely a rendszerben nem áll rendelkezésünkre, akkor magunk is írhatunk Matlab függvényt és elhelyezhetjük az általunk kiválasztott, a Matlab rendszer által ismert könyvtárban mint egy m-fáljt. Ezután a rendszer sajátjaként fogja kezelni a függvényt, ezért vigyázni kell arra, hogy ne adjunk olyan függvénynevet, amely a rendszerben már van, mert ekkor bizonytalanná válhat a rendszer működése: a Matlab mindig azt a függvényt használja amit először talált meg. 2010.11.16. V. előadás 2
Új Matlab függvény megírásának módja: Definiálunk egy m kiterjesztésű fájlt, melynek a neve megegyezik azzal a névvel, amivel később az új függvényt a rendszerünkben használni szeretnénk. Ebben az m-fájlban megszerkesztjük azt a programot, mely a függvényünktől megkívánt funkciókat teljesíti. Afüggvényt megadó program első sorában kell megadjuk, hogy a szóban forgó fájl egy függvény, továbbá itt határozzuk meg a függvény nevét, valamint a bemenő és kijövő paramétereit. function [ki1,ki2, ]=fgv_nev(be1,be2, ) A függvény által elvégzett feladatokat és a használat módját célszerű a függvény listájában megjegyzések formájában rögzíteni. Erre szolgálnak a % karakterrel kezdődő sorok. Ezeket a help fgv_nev parancs hatására jeleníti meg a Matlab; a magyarázó szöveg első sorát érdemes jól megfogalmazni, mert a lookfor text utasítás ott keresi a text karakterláncot. Függvénytcsak meghívni lehet futtatni nem: >>[a,b, ]=fgv_nev(4, alma, ) 2010.11.16. V. előadás 3
Példaprogramok 1. Írj függvényt, amely kiszámolja a f(x,y)=(x+1,y 2 +2x+y-1) matematikai függvény értékét. function z=fgv(x,y) % f(x,y)=(x+1,yy+2x+y-1) függvény %értékét adja meg z1=x+1; z2=y*y+2*x+y-1; z=[z1 z2]; >>a=fgv(2,8) 2. Írj függvényt, amely egy karakterlánc minden harmadik karakterét megduplázza. function z=duplaz(s) % egy karakterlánc minden harmadik %karakterét megduplázza z=''; for i=1:length(s) 1l th() z=[z s(i)]; if mod(i,3)==0 z=[z s(i)]; end end >>z=duplaz( almafa ) 2010.11.16. V. előadás 4
Afüggvények paraméterei Függvények esetében megkülönböztetjük a függvényhívás paramétereinek számát és a függvény által visszaadott paraméterek számát. A függvényhívás paramétereinek számát a Matlab rendszerben a nargin változó adja meg. A függvény által visszaadott értékek számát a nargout változó tartalmazza. Egy függvényt kevesebb paraméterrel is meglehet hívni, mint a hívó paramétereinek a száma, és a felhasználni kívánt értékek száma is kevesebb lehet, mint amennyi változó értéket a függvényünk visszaad, de a paraméterek csak a paraméter lista végérőlhiányozhatnak. A Matlab hibát csak akkor jelez, ha valahol több paramétert használunk, mint amit a függvény írásánál megadtunk. 2010.11.16. V. előadás 5
Példaprogramok 1. Írj függvényt amely megadja a bemenő és kijövő paraméterek számát. function [ki1 ki2]=argszam(be1,be2,be3), if nargin<1 ki1=0; elseif nargin==1 ki1=1; elseif nargin==2 ki1=2; else ki1=3; end if nargout<1 ki2=0; elseif nargout==1 ki2=1; else ki2=2; end >> [a b]=argszam(1, 3) a = 2 b = 2 2. Írj függvényt amelynek ha egy bemenő paramétere van, kiírja a szám gyökét, ha kettő összeadja a két szám közötti számokat, ha három kiírja az átlagukat. function ki=muvelet(be1,be2,be3) if nargin==1 ki=sqrt(be1); elseif nargin==2 ki=sum(be1:be2); elseif nargin==3 ki=(be1+be2+be3)/3; else disp('nem adtal meg parametert!') end >> a=muvelet(6) a = 2.4495 >> a=muvelet(6,9) a = 30 >> a=muvelet(6,9,1) a = 5.3333 >> muvelet Nem adtal meg parametert! 2010.11.16. V. előadás 6
M-fájlok futását vezérlő utasítások pause Felfüggeszti az m-fájl futását. A program futása bármilyen billentyű lenyomása esetén folytatódik. pause(n) A program végrehajtását n másodpercig felfüggeszti. pause on/off break Beállítható, hogy a pause parancsokat a rendszer figyelembe vegye vagy se. A for vagy while ciklusok futását megszakítja. return Egy m-fájl futását át megszakítja. error(szöveg) Az m-fájl végrehajtása befejeződik és a hibaüzenet a képernyőn kiírásra kerül. global lbl Globális változók definiálására iáláá szolgál. Hatását á aclearl global lbl utasítással szüntethetjük meg. keyboard Meghívja a billentyűzetet, mintha az egy végrehajtható fájl lenne. A program végrehajtása folytatódik, amint a return utasítást begépeltük. 2010.11.16. V. előadás 7
Eval és feval utasítások A Matlab megengedi, hogy egy függvény paramétere függvénynév legyen. Mivel a függvények neve szöveges változó, szükségünk lesz arra, hogy a meghívott függvény belsejében a függvény nevét vissza tudjuk konvertálni az aktuálisan megnevezett függvényt meghívó végrehajtó utasítássá. Ezt a célt szolgálják az eval és feval utasítások. Az eval utasítás arra szolgál, hogy paraméterrel, vagy paraméterekkel együtt szövegesen megadott függvény kiértékelését elvégezzük a megadott paraméter(ek) értékére. >> x=7; >> valt='sin(x)'; >> eval(valt) ans = 0.6570 A feval utasítás az eval utasításhoz hasonló funkciót tölt be. A feval utasítás használatakor csak a függvény nevét kll kell megadni diszövegesen, és a függvény paramétereinek értékét az feval utasításban kell felsorolni a függvény neve után. >> valt='sin' >> feval(valt,7) ans = 0.6570 2010.11.16. V. előadás 8
Példaprogram function y=tablazat1(ff,a,b,n) a b function y=tablazat2(ff,a,b,n) a b % az f fuggveny ertekeit [a,b] intervalum n pontjaban adja meg % az eredmeny az y=[x f(x)] tablazatban jelenik meg x=linspace(a,b,n); z=eval(ff); y=[x;z]; % az f fuggveny ertekeit [a,b] intervalum n pontjaban adja meg % az eredmeny az y=[x f(x)] tablazatban jelenik meg x=linspace(a,b,n); z=feval(ff,x); y=[x;z]; >> tablazat1('sin(x)',0,1,5) >> tablazat2('sin',0,1,5) ans = ans = 0 0.2500 0.5000 0.7500 1.0000 0 0.2500 0.5000 0.7500 1.0000 0 0.2474 0.4794 0.6816 0.8415 0 0.2474 0.4794 0.6816 0.8415 2010.11.16. V. előadás 9
Állományok kezelése Gyakran kívánatos, hogy a számításaink eredményeit, bizonyos helyre elrakhassuk, például annak érdekében, hogy abból további számítások kiindulhassanak. Ha csak néhány változó tartalmát kívánjuk megőrizni, illetve felhasználni, akkor erre a load és save utasításokat alkalmazzuk. Sokszor előfordul, hogy egy program működéséhez szükséges adatokat egy másik program korábban már előállította, vagy a mi programunk által kapott valamilyen eredményt, egy másik program használ a későbbiek során. Ennek a kapcsán a dlmread és a dlmwrite utasításokat fogjuk tanulmányozni. Ezen utasítások használatával indirekten az adatokat beolvashatjuk Exel állományból, illetve kimenthetjük. Ezeken kívül a Matlab még számos állomány kezeléssel kapcsolatos utasítást felkínál. Ezek használata sok hasonlóságot mutat a C nyelv megoldásaival, több részletben teljesen azonos. (fopen, fread, fwrite, fprintf, fscanf, stb) További részletekért lásd: Stoyan Gisbert, Matlab című könyvének 266-280 oldalait. 2010.11.16. V. előadás 10
Save utasítások save fnév v stb save fnév v stb -ascii save fnév v stb ascii -double A v, stb változókat menti aktuális értékükkel az fnév nevű fájlba. A mentés bináris. Ha nincs változólista, az összes változót menti. Itt a mentés egy acii fájlba, 8 decimális jeggyel történik. Mentés acsii fájlba, 16 decimális jeggyel. A save utasítás felülírja az esetleg már meglévő fájlt. Ha a meglévő tartalom törlése nélkül akarjuk folytatni, akkor írjunk append opciót. Ha a load vagy save utasítás önmagában áll, akkor a matlab.mat névre ment, vagy olvas. Kiterjesztés nélkül, vagy nem.mat kiterjesztésű fájl is lehet bináris, ekkor viszont mind a save, mind a load utasításban kötelezően a mat opciót is írni kell. Ha save fnev v1 v2 stb acsii utasításban v1, v2, stb azonos méretű tömbök, akkor a fájlban egyetlen tömbként tárolódnak, mégpedig [v1; v2; stb] konstrukcióval. Ha a méretek nem azonosak, akkor akésőbbi load fnév ascii hibát jelez. 2010.11.16. V. előadás 11
Load utasítások A mat kiterjesztésű fájl, az a fájlformátum, amelyet a Matlab alkalmaz adatok tárolásához. A mat-fájlok egyben annak legfontosabb eszközét jelentik, hogy adatokat vigyünk be a Matlab környezetbe, illetve írjunk ki C és Fortran programokkal való feldolgozás céljára. A mat-fájlok egy vagy több mátrixot tartalmaznak szekvenciálisan, folytonos bájtsorozatként. Minden mátrix egy rögzített hosszúságú fejléccel kezdődik, ami a mátrix tulajdonságait írja le. Közvetlenül utána következnek az aktuális adatok, amelyeknek hosszúsága a fejlécben megtalálható. Ez ismétlődik a fájlban tárolt összes mátrixra. load fnév v stb load név.kit load név v stb -ascii A v stb változókat betölti az fnév nevű (.mat kiterjesztésű) bináris fájlból. Ha nincs változólista, az összes változót betölti. Betölti a név.kit ascii fájlt. Ez egyetlen mátrixot tartalmazhat, t t és ez lesz a név nevűű változó aktuális értéke. A kiterjesztés nem hiányozhat, és nem lehet.mat kiterjesztés. Mint előbb, de itt az állomány névnél nincs megadva a kiterjesztés. 2010.11.16. V. előadás 12
Példaprogramok >> s='almafa'; >> A=rand(2) A = 0.8913 0.4565 0.7621 0.01850185 >> g=11; >> v=[1 3 2 5] >> save mind >> load mind >> save f.mat A s >> t=load('f.mat mat') t = s: 'almafa' A: [2x2 double] >> load f.mat >> b=[1 5-2 7]; >> k=[0 2-1 1]; >> save e.txt b k -ascii >> load e.txt >> e e = 1 5-2 7 0 2-1 1 >> save( 'e.txt','b', 'k', '-ascii', '-append') >> D=load( 'e.txt') D= 1 5-2 7 0 2-1 1 1 5-2 7 0 2-1 1 2010.11.16. V. előadás 13
Dlmread, dlmwrite utasítások Különböző elválasztókat használó állományból való olvasás a utasítással történik. Használat: dlmread m=dlmread( állománynév, elválasztó) m=dlmread( c:\a.txt, * ) beolvassa az a.txt állomány tartalmát ahol a számok * karakterrel vannak elválasztva egymástól. Az EXCEL állományokat le lehet menteni.txt kiterjesztésű állományokba, ahol az elválasztó a tabulátor. Egy ilyen fájl beolvasásánál az elválasztónak a '\t' adjuk. m=dlmread(állománynév,elválasztó, sor, oszlop) a sor és oszlop paraméterek megadják, hogy a beolvasás honnan kezdődjön (az indexelés zérótól indul). m=dlmread(állománynév,elválasztó,tartomány) - ahol a tartomány formája: [R1 C1 R2 C2], az R1 C1 jelenti a bal felső sarkat, míg az R2 C2 a jobb alsó sarkat. A tartományt meg lehet adni az EXCEL-ben használt jelölésekkel is: A3..B7 Írás állományba elválasztókkal a dlmwrite utasítással történik. Használat: dlmwrite(állomány,mátrix,elválasztó) 2010.11.16. V. előadás 14
Példaprogram 1. Olvass be n darab karakterláncot, 2. Olvass be egy mátrixot egy amelyeket írj ki egy szöveges szöveges állományból (az állomány állományba. nevét kérd be), majd szorozd össze egy generált állománnyal. n=input('n='); sz=input('szoveg=','s') dlmwrite('a.txt',sz); txt' for i=1:n-1 sz=input('szoveg=','s') dlmwrite('a.txt',sz,'-append'); end Jobb klikk üres hely: New/Text Document (létrehozol egy.txt kiterjesztésű állományt) fn=input('kerem a fajl nevet=','s'); A=dlmread(fn,' d(f '')') [n m]=size(a); B=rand(m,2) szorzat=a*b 2010.11.16. V. előadás 15
Példaprogram Feladat Excel állományba, írjunk be adatokat. Mentsük le Text (tab delimited) formátumba. Majd olvassuk be azígyelőállított állomány adatait a Matlab programunkba. s.txt állomány tartalma >> A=dlmread('s.txt','\t') A = 1 2 5 6 7 8-2 12 3 6 0-1 >> A=dlmread('s.txt','\t', 1, 1) A = 7 8 12 3 0-1 >> A=dlmread('s.txt','\t', [1 0 2 1]) A = 6 7-2 12 >> A=dlmread('s.txt','\t', 'A2..B3') A = 6 7-2 12 2010.11.16. V. előadás 16
Feladat Egy mátrix tartalmát írjuk ki excel állományba. >> B=[1 2 4 6; 3 3-1 9; 4 1 1 2] B = 1 2 4 6 3 3-1 9 4 1 1 2 >> dlmwrite('k.txt',b,'\t') Ha az így kapott k.txt állományt megnyitjuk az Excel program segítségével kapjuk: 2010.11.16. V. előadás 17