MATLAB 9. gyakorlat Cellatömbök, struktúrák, fájlműveletek
Menetrend Kis ZH Cellatömbök és használatuk Struktúrák és használatuk Fájlműveletek
Kis ZH pdf
Félévzárás (1) Akinek egyik nagyzh-ja sem sikerült (<50%), annak a féléve sajnos sikertelen. Akinek csak az egyik nagyzh-ja nem sikerült (<50%), azt a pótzh-n javítania kell. Akinek mindkét nagyzh-ja sikerült (>=50%), de a kiszh összege nincs 0 fölött, annak a rosszabbul sikerült nagyzh eredménye törlődik, és a vonatkozó anyagból pótzh-t kell írnia.
Félévzárás (2) Minden olyan esetben, amikor pótzh-t kell írni, a pótzh minimum ponthatára emelkedni fog a kiszh-k összpontszáma alapján, ha azok összege 1 alatt van. 1 fölötti kiszh összeg esetén a pótzh minimum ponthatára 50%. 1 alatti összeg esetén a ponthatár emelkedésének mértéke (1 - Σ kiszh)*5% lesz az alábbiak szerint: Σ kiszh = 0 => pótzh minimum = 55% Σ kiszh = -2 => pótzh minimum = 65% Σ kiszh = -4 => pótzh minimum = 75% Σ kiszh = -6 => pótzh minimum = 85% Σ kiszh = -8 => pótzh minimum = 95% Σ kiszh = -10 esetén a félév sikertelen.
Félévzárás (3) FONTOS: a pótzh minimum ponthatárának emelése a megfelelő pontszámok levonásával fog megtörténni, ezért a kiszh-n elért 1nél kisebb összeg bünetőpontként fog megjelenni. Ennek értelmében pl. Σ kiszh = -6 esetén egy 95%-os pótzh a valóságban 60%-nak fog megfelelni. Akinek mindkét nagyzh-ja sikerült (>50%) és a kiszh összege is 1 fölött van, annak értelem szerűen nem kell pótzh-t írnia, viszont az egyik általa választott nagyzh-t javíthatja, ha szeretné (ezt majd előre jelezni kell). A javító ZH minden esetben felülír.
Cellatömbök Olyan adattípus, melyet különböző típusú és/vagy méretű változók tárolására használhatunk. Üres cellatömb létrehozása: C = cell(2,2); Cellatömb elemeinek indexelése a { } zárójelekkel, rész-cellatömb indexelése a ( ) zárójelekkel történik. Cellatömb létrehozása ismert elemekkel: C = {1, 2; 3, 4} Fontos, hogy az egyes cellákban teljesen eltérő elemeket tárolhatunk, akár további cellatömböket is.
Példa 1.1. Hozzunk létre egy 3 2 méretű üres cellatömböt! Az egyes cellákat oszlopfolytonosan töltsük fel az alábbi elemekkel: 'szöveg' 12 [8.13, 14.86] magic(5) cell(2,4) {1, 2, 3;4, 5, 6} Jelenítsük meg a cellatömb tartalmát a cellplot parancs használatával!
Megoldás 1.1. % cellatömb létrehozása C1 = cell(3,2); % feltöltés oszlopfolytonosan C1{1,1} = 'szöveg'; C1{2,1} = 12; C1{3,1} = [8.13, 14.86]; C1{1,2} = magic(5); C1{2,2} = cell(2,4); C1{3,2} = {1, 2, 3; 4, 5, 6}; % megjelenítés cellplot(c1); title('c1 tartalma');
Megoldás 1.1. % cellatömb létrehozása C1 = cell(3,2); % feltöltés oszlopfolytonosan C1{1,1} = 'szöveg'; C1{2,1} = 12; C1{3,1} = [8.13, 14.86]; C1{1,2} = magic(5); C1{2,2} = cell(2,4); C1{3,2} = {1, 2, 3; 4, 5, 6}; % megjelenítés cellplot(c1); title('c1 tartalma');
Példa 1.2. Az előző cellatömböt hozzuk létre egy paranccsal, a megadott elemek használatával! Jelenítsük meg a cellatömb tartalmát a cellplot parancs használatával!
Megoldás 1.1. % létrehozás ismert elemekből C2 = {'szöveg', magic(5); 12, cell(2,4); [8.13 14.86], {1, 2, 3; 4, 5, 6}}; % megjelenítés figure; cellplot(c2); title('c2 tartalma');
Megoldás 1.1. % létrehozás ismert elemekből C2 = {'szöveg', magic(5); 12, cell(2,4); [8.13 14.86], {1, 2, 3; 4, 5, 6}}; % megjelenítés figure; cellplot(c2); title('c2 tartalma');
Példa 2. Töltsünk fel egy cellatömböt az alábbiak szerint: az első eleme egy sorvektor legyen (t), ami 0-tól 2πig tartalmaz 1000 értéket egyenletesen elosztva a második sorban a 'Sin(3t)', 'Cos(5t)' és 'Sin(3t)*Cos(5t)' stringek álljanak a harmadik sorban a stringeknek megfelelő numerikus értékek legyenek eltárolva Ciklus használatával rajzoljuk ki a fent kiszámolt értékeket egy ábrán 3 subplotra fekete színnel! A subplotok címeit is a cellatömbből írjuk ki!
Megoldás 2. c{1,1} c{2,1} c{2,2} c{2,3} c{3,1} c{3,2} c{3,3} = = = = = = = linspace(0,2*pi,1000); 'Sin(3t)'; 'Cos(5t)'; 'Sin(3t)*Cos(5t)'; sin(3*c{1,1}); cos(5*c{1,1}); c{3,1}.*c{3,2}; figure; for spi=1:size(c,2) subplot(3,1,spi); plot(c{3,spi},'k'); title(c{2,spi}); xlabel('t') end
Megoldás 2.
Struktúrák A cellatömbökhöz hasonlóan különböző típusú és/vagy méretű változók tárolására használható adattípus azzal a különbséggel, hogy a tárolt adatok névvel ellátott mezőkbe kerülnek (hasonlóan pl a C nyelv struct típusához).
Struktúrák - példa hallgato.nev = 'Kis Pista'; hallgato.szul_datum = '1992.03.24.'; hallgato.evfolyam = 3; hallgato.osztalyzatok = [2 4 3 5 3 4 4 3]; >> hallgato >> hallgato.nev hallgato = ans = nev: szul_datum: evfolyam: osztalyzatok: 'Kis Pista' '1992.03.24.' 3 [2 4 3 5 3 4 4 3] Kis Pista
A korábbi kirajzolós példa (struktúra tömb) % idővektor t = linspace(0,2*pi,1000); % első ábra rajz(1).x = t; rajz(1).y = sin(3*rajz(1).x); rajz(1).cim = 'Sin(3t)'; % második ábra rajz(2).x = t; rajz(2).y = cos(5*rajz(2).x); rajz(2).cim = 'Cos(5t)'; % harmadik ábra rajz(3).x = t; rajz(3).y = rajz(1).y.* rajz(2).y; rajz(3).cim = 'Sin(3t)*Cos(5t)'; % kirajzolás figure; for pli = 1:length(rajz) subplot(3,1,pli); plot(rajz(pli).x,rajz(pli).y,'k'); title(rajz(pli).cim); end
A korábbi kirajzolós példa (struktúra tömb)
Fájlkezelés Többféle módon lehet MATLAB-ban fájlokat írni/olvasni, melyek közül az alábbi három módszerről lesz szó: fájl írás/olvasás formázott szövegként fájl írás/olvasás táblázatként fájl írás/olvasás binárisan
Fájlkezelés Többféle módon lehet MATLAB-ban fájlokat írni/olvasni, melyek közül az alábbi három módszerről lesz szó: fájl írás/olvasás formázott szövegként fájl írás/olvasás táblázatként fájl írás/olvasás binárisan
Elérési útvonalak A kiíráshoz kelleni fog a célkönyvtár elérési útvonala stringként megadva: Windows alatt pl.: DIR_PATH = 'D:\myfolder\file_op\'; Linux alatt pl.: DIR_PATH = '/home/myfolder/file_op/'; Az egyes platformokon más a fájlelválasztó karakter ('\' vagy '/'), ami csapatmunka esetén problémás lehet. Erre nyújt megoldást a filesep parancs, amely megadja az aktuális platformon használt elválasztó karaktert. Ezt beépítve az elérési útvonalakba, nem lesz gond a platformok között a fájlkezeléssel. Pl. az aktuális helyhez képest vett relatív címzés esetén: fs = filesep; DIR_PATH=['.' fs 'files' fs];
Fájlba írás formázott szövegként fprintf(fileid, format, A) fileid : a megnyitott fájl azonosítója format : kiírási formátum (részletek később) A : kiírandó adat
Kiírási formátum Stringként kell megadni. A formázó string % karakterrel kezdődik, utána jön a minimális mezőhossz (a tizedespont és az előjel is benne van), a pontosság és formátum. Fontos, hogy egyéb stringek közé ékelkető, előtte és utána további stringek lehetnek (részletek a Help-ben).
Kiírási formátum - példa % pl.: '%4.4f' % '%3.2e' % '%4.5d' % '%+7.4f' % '%010.3f ' -> -> -> -> -> fixpontos exponencialis 10-es alapu egesz fixpontos, + jellel fixpontos, 0-ákkal az elején >> x = [1.2 3.3 4]; >> fprintf('x értékei: x(1) = %4.4f, x(2) = %3.1f, x(3) = %d \n',x); x értékei: x(1) = 1.2000, x(2) = 3.3, x(3) = 4 fileid nélkül a Command Window-ba ír.
Szinusz jel kiírása (1) % kiirando jel generalasa % mintaveteli frekvencia Fs=1000; % Hz % idovektor t=0:1/fs:10; % s % a szinusz frekvenciaja f=5; % Hz % szinusz jelalak s=sin(2*pi*f*t); % az adott helyhez kepest vett relativ cimzes % (lehet abszolut is, teljes utvonallal) fs = filesep; DIR_PATH=['.' fs 'files' fs]; % a kiirando fajl neve filename='szinusz_fprintf.txt'; % a fajl eleresi utvonala (ha csak a fajlnevet % adom meg, az aktualis konyvtarba menti) file_path=[dir_path filename];
Szinusz jel kiírása (2) % fajl megnyitasa irasra, ez utan az fid-val % hivatkozok erre a fajlra fid=fopen(file_path,'w'); % header irasa, hogy tudjuk, mi van a fajlban % pl.: Szinusz (Fs = 1000) fprintf(fid,['szinusz (Fs = ' num2str(fs) ') \n']); fprintf(fid,'t sin \n'); % az iras utan nyitva marad a fajl % ezert irhatok meg bele formazott adatot % irjuk bele a kiszamolt szinusz fuggvenyt fprintf(fid,'%5.2f %4.4f\n',[t;s]); % fajl bezarasa - FONTOS, ne felejtsuk el! fclose(fid);
Eredmény
Fájlból olvasás formázott szövegként (fscanf) % az fscanf csak az alap formazo % karaktereket ismeri (lasd HELP) % fajl beolvasasa formazott % szovegkent % a beolvasando fajl neve (amit % az elobb kiirtunk) filename='szinusz_fprintf.txt'; % eloszor a header beolvasasa % stringkent Sheader=fscanf(fid,'%s',6); % a fajl eleresi utvonala file_path=[dir_path filename]; % majd az adatok beolvasasa % fixpontos szamkent Sdata=fscanf(fid,'%f %f',[2 inf]); % fajl megnyitasa olvasasra fid=fopen(file_path); % fajl bezarasa fclose(fid); % beolvasott adatok kirajzolasa figure; plot(sdata'); legend('t','sin');
Fájlból olvasás formázott szövegként (fscanf)
Fájlból olvasás formázott szövegként (textscan) % a textscan-nek lehet regularis % kifejezest is adni (lasd HELP) % fajl beolvasasa cellatã mbbe % header beolvasasa Sheader_ts=textscan(fid,'%s',6); % a beolvasando fajl neve (meg % mindig ugyanaz) filename='szinusz_fprintf.txt'; % adatok beolvasasa Sdata_ts=textscan(fid,'%f %f'); % a fajl eleresi utvonala file_path=[dir_path filename]; % fajl bezarasa fclose(fid); % fajl megnyitasa olvasasra fid=fopen(file_path); % beolvasott adatok kirajzolasa tt = Sdata_ts{1}; data = Sdata_ts{2}; figure; plot(tt,data);
Fájlból olvasás formázott szövegként (textscan)