5. Előadás Matlab függvények, adatfeldolgozás állományok kezelése. adatfeldolgozás, 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 mfá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 bi bizonytalanná t l á válhat álh t a rendszer d működése: űködé a Matlab M tl b mindig i di aztt a függvényt fü é t 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. A függvényt gg y megadó g pprogram g első sorában kell megadjuk, g j , hogy gy a szóban forgó g 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. gg y csak meghívni g lehet futtatni nem: Függvényt >>[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 2. Írj függvényt, amely egy f(x,y)=(x+1,y2+2x+y-1) matematikai karakterlánc minden harmadik függvény értékét. karakterét megduplázza. g ( ,y) 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)
2010.11.16.
function z=duplaz(s) % egy karakterlánc minden harmadik %karakterét megduplázza
z=''; f i=1:length(s) for i 1 l th( ) z=[z s(i)]; if mod(i,3)==0 z=[z s(i)]; end end >>z=duplaz(‘almafa’) V. előadás
4
A fü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 ap paraméterek csak a p paraméter lista végéről g hiányozhatnak. y 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) ] g ( , , ) if nargin<1 ki1=0; elseif nargin==1 ki1=1; elseif nargin==2 g ki1=2;; else ki1=3; end if nargout<1 g ki2=0;; elseif nargout==1 ki2=1; else ki2=2; end >> [a b]=argszam(1, 3) a= 2 b= 2
2010.11.16.
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 i 1 ki=sqrt(be1); ki (b 1) elseif nargin==2 ki=sum(be1:be2); elseif nargin==3 ki=(be1+be2+be3)/3; else l disp('Nem di ('N adtal d l meg parametert!') !') end >> a=muvelet(6) a = 2.4495 2 4495 >> a=muvelet(6,9) a = 30 >> a=muvelet(6,9,1) a = 5.3333 >> muvelet Nem adtal meg parametert!
V. előadás
6
M fájlok futását vezérlő utasítások M-fájlok pause
Felfüggeszti az m-fájl m fájl futását. 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
Beállítható, hogy a pause parancsokat a rendszer figyelembe Beállítható vegye vagy se.
break
A for vagy while ciklusok futását megszakítja.
return t
E m-fájl Egy fájl futását f tá át megszakítja. kítj
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 l b l
Globális Gl báli változók ál ók definiálására d fi iálá á szolgál. l ál Hatását H á á a clear l global l b l 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, lenne. folytatódik amint a return utasítást begépeltük.
2010.11.16.
V. előadás
7
Eval és ffeval 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, g hogy gy pparaméterrel, vagy gy pparaméterekkel együtt gy 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)'; 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 h használatakor ál t k csakk a függvény fü é nevét ét kell k ll megadni d i szövegesen, ö é a függvény és fü é 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 yy=tablazat1(ff tablazat1(ff,a,b,n) a b n) % 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); l(ff) y=[x;z];
function yy=tablazat2(ff tablazat2(ff,a,b,n) a b n) % 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); f l(ff ) y=[x;z];
>> tablazat1('sin(x)',0,1,5) ans = 0 0.2500 0.5000 0.7500 1.0000 0 00.2474 2474 0.4794 0 4794 0.6816 0 6816 0.8415 0 8415
>> tablazat2('sin',0,1,5) ans = 0 0.2500 0.5000 0.7500 1.0000 0 00.2474 2474 0.4794 0 4794 0.6816 0 6816 0.8415 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, elrakhassuk, é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, 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 p a dlmread és a dlmwrite utasításokat fogjuk gj 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 g számos állomány y kezeléssel kapcsolatos p 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
A v, stb változókat menti aktuális értékükkel az ffnév nevű fájlba. j A mentés bináris. Ha nincs változólista, az összes változót menti.
save fnév v stb -ascii
Itt a mentés egy acii fájlba, 8 decimális jeggyel történik.
save fnév v stb –ascii -double
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, nélkül vagy nem .mat mat kiterjesztésű fájl is lehet bináris, 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 a ké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, 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
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.
load név.kit
Betölti a név.kit ascii fájlt. Ez egyetlen mátrixot t t l tartalmazhat, h t és é ez lesz l a név é nevűű változó ált ó aktuális kt áli értéke. A kiterjesztés nem hiányozhat, és nem lehet .mat kiterjesztés.
load név v stb -ascii ascii
Mint előbb, 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 A=rand(2) rand(2) A= 0.8913 0.4565 0 7621 0.0185 0.7621 0 0185 >> g=11; >> v=[1 3 2 5] >> save mind >> load mind >> save f.mat A s >> t=load( t=load('ff.mat mat')) t= s: 'almafa' A: [2x2 double] >> load f.mat 2010.11.16.
>> b=[1 5 -2 7]; >> kk=[0 [0 2 -1 1]; >> save e.txt b k -ascii >> load e.txt >> e e= 1 5 -2 7 0 2 -11 1 >> save( 'e.txt','b', 'k', '-ascii', '-append') >> D=load( 'e.txt') D= 1 5 -2 7 0 2 -1 1 1 5 -22 7 0 2 -1 1 V. előadás
13
Dlmread dlmwrite utasítások Dlmread, 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. gy Az EXCEL állományokat y 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. 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 gy mátrixot egy gy 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); dlmwrite('a.txt',sz); for i=1:n-1 sz=input('Szoveg=','s') dlmwrite('a.txt',sz,'-append'); end
2010.11.16.
Jobb klikk üres hely: New/Text Document (létrehozol egy .txt txt kiterjesztésű állományt) fn=input('Kerem a fajl nevet=','s'); A dl A=dlmread(fn,' d(f ' ') [n m]=size(A); B=rand(m,2) szorzat=A*B 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 így előá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
2010.11.16.
>> A=dlmread('s.txt','\t', 1, 1) >> A=dlmread('s.txt','\t', [1 0 2 1]) A= A= 7 8 6 7 12 3 -22 12 0 -1 >> A=dlmread('s.txt','\t', 'A2..B3') A= 6 7 -2 12 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') dl i (k \ ) 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