KURZUS: Számítási módszerek
MODUL: Matematikai számítások MATLAB-bal
1. lecke: A MATLAB alapjai, ablakok, súgórendszer, adattípusok
Cél: Első leckénkben a programrendszer általános áttekintése mellett az adattípusokkal ismerkedünk meg, erre építve léphetünk majd tovább a későbbiekben. | |||||||||||||||||||||||||||||||||||||||||||||||||
Követelmények: Ön akkor sajátította el megfelelően a tananyagot, ha (a MATLAB segítségével) | |||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
Időszükséglet: A tananyag elsajátításához (a feladatok megoldásával együtt) hozzávetőlegesen 4 órára lesz szüksége. | |||||||||||||||||||||||||||||||||||||||||||||||||
Kulcsfogalmak | |||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
Alapvető információk a MATLAB-ról | |||||||||||||||||||||||||||||||||||||||||||||||||
A MATLAB rendszerről általában | |||||||||||||||||||||||||||||||||||||||||||||||||
A MATLAB szoftverrendszer (Matrix Laboratory) a mérnöki és matematikai számítások nagyon fontos segítőeszköze. Ez a programcsomag több komponensből áll, része(i) többek között: | |||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
A MATLAB fejlesztése az 1970-es években kezdődött. A programot eredetileg oktatási segédeszköznek szánták (lineáris algebra és numerikus matematika területeken), később azonban az egyre jobban kibontakozó érdeklődés hatására az alkalmazott matematika és a tudományos számítások irányába mozdultak el. Napjainkban a MATLAB univerzális, robusztus, nagy tudású szoftverrendszer, amelynek sokoldalú alkalmazhatósága magával hozta a fejlesztők számára a kiemelkedő üzleti sikert is. | |||||||||||||||||||||||||||||||||||||||||||||||||
A MATLAB használatának főbb logikai szintjei a következők. | |||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
A MATLAB legfontosabb adattípusa a mátrix (ennek elemei pedig alapértelmezés szerint lebegőpontos számok). A rendszer skalárokkal is úgy számol, mint 1×1-es mátrixokkal. A mátrixokon értelmezett műveletek és függvények segítségével nagyon összetett feladatok megoldását lehet röviden és tömören megfogalmazni. (A mátrixokkal a 2. és 3. leckében foglalkozunk részletesen.) | |||||||||||||||||||||||||||||||||||||||||||||||||
Az, hogy a MATLAB alapvetően mátrixokkal számol, csak első látásra szokatlan. Más elemző rendszerek is használnak mátrixmanipulációs eszközöket. Ilyen például az SPSS statisztikai elemző rendszer is, mely a MATRIX. és END MATRIX. szekcióba zárt parancsaival és függvényeivel szintén tömör mátrixmanipulációs lehetőségeket biztosít. (pl. EIGEN() - sajátértékszámítás, SVD() - Singular Value Decomposition, T() - Transpose, MDIAG() - oszlopvektor diagonálmátrixba alakítása stb.) | |||||||||||||||||||||||||||||||||||||||||||||||||
Bár a MATLAB fő profilja a számítások numerikus támogatása, szimbolikus modullal is rendelkezik. | |||||||||||||||||||||||||||||||||||||||||||||||||
A konkrét használat megkezdése előtt végül megemlítjük, hogy a MATLAB fizetős, mégpedig elég drága szoftver. Diákok számára jelentős kedvezménnyel megvásárolható a Student verzió (a teljes rendszerhez képest némileg korlátozott szolgáltatásokkal), ennek ára már a tolerálható szinten belül van. | |||||||||||||||||||||||||||||||||||||||||||||||||
Ha az otthoni gépünkön egyáltalán nincs jogunk a MATLAB használatához, akkor a hasonló felépítésű és szerepű, de egyszerűbb Octave ingyenes szoftvert használhatjuk. A program használható online változatban (következő ábra), vagy letölthető a következő linkek valamelyikéről (Octave, GUI Octave és Octave Forge): | |||||||||||||||||||||||||||||||||||||||||||||||||
http://www.gnu.org/software/octave/download.html | |||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
A MATLAB indítása, ablakok, kilépés | |||||||||||||||||||||||||||||||||||||||||||||||||
A MATLAB indítása asztalon lévő parancsikonnal, fájlkezelőből, vagy a Start menüből történhet. A MATLAB a hozzá társított speciális kiterjesztésű fájlokra duplán kattintva is elindul (.m, .fig, .mat). A program indítása után rögtön feltűnik a névjegye (következő ábra). | |||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
A rendszer alapértelmezés szerint 5 klasszikus ablakkal indul el. Indítás és néhány parancs begépelése után a következő ábrán látható képernyőképet kaphatjuk. | |||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
A szokásos ablakok (alapbeállítás esetén megnyílók, lásd ábra): | |||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
Az ablakok (esetleg korlátozottan) áthelyezhetők, átméretezhetők, ki- és bekapcsolhatók. | |||||||||||||||||||||||||||||||||||||||||||||||||
A Desktop menüben próbálja ki, hogy az ablakok megjelenítése szabályozható. | |||||||||||||||||||||||||||||||||||||||||||||||||
Speciális ablakok (ezeket esetenként nyitjuk meg; csak a fontosabbak, névsorban): | |||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
A parancsablakban (Command Window) azonnal megjelenik a >> parancs prompt, itt kezdhetjük el a munkát. A parancsablakban Student verziók esetében figyelmeztetést is kapunk, hogy a program csak oktatási célra használható! | |||||||||||||||||||||||||||||||||||||||||||||||||
Az első parancsként célszerű olyan aktuális könyvtárat (Current Folder) beállítani, amelyhez kellő írási és olvasási jogunk van. | |||||||||||||||||||||||||||||||||||||||||||||||||
>> cd c:\munka | |||||||||||||||||||||||||||||||||||||||||||||||||
A begépelt és helyes parancsot, vagy kifejezést az Enter lenyomása után a MATLAB azonnal kiértékeli, illetve végrehajtja, és ha kell, akkor válaszol rá, majd a végrehajtott parancs megjelenik az előzmények (Command History) ablakban is. A Command History ablakbeli parancsainkat vágólapon keresztül szöveges fájlokba másolhatjuk későbbi ismételt felhasználás céljára. A Command History tartalma tetszés szerint törölhető is. | |||||||||||||||||||||||||||||||||||||||||||||||||
Jegyezze meg a Command History ablakból szöveges fájlba történő mentés lehetőségét. A későbbiekben külön útmutatás nélkül alkalmazza ezt a technikát, ha a parancsokat meg szeretné őrizni. | |||||||||||||||||||||||||||||||||||||||||||||||||
Ha a parancs, vagy kifejezés megjeleníthető eredményét nem rendeljük változóhoz, akkor az automatikusan az ans nevű belső változóhoz rendelődik (lásd tridiag(3, 1, -2, 5) függvényhívás), és annak korábbi értékét felülírja. | |||||||||||||||||||||||||||||||||||||||||||||||||
Ha a parancsot a (;) pontosvessző jel zárja, akkor a végrehajtás utáni eredmény nem kerül kijelzésre (lásd tridiag(3, 1, -2, 5); függvényhívás). | |||||||||||||||||||||||||||||||||||||||||||||||||
Amíg nem lépünk ki a MATLAB-ból, az aktív parancs promptnál a kurzor fel és le billentyűk segítségével a korábbi parancsaink között tallózhatunk, és az előhívott parancsot közvetlenül, vagy átszerkesztve megismételhetjük. | |||||||||||||||||||||||||||||||||||||||||||||||||
A diary on parancs hatására egy új naplófájl keletkezik az aktuális könyvtárban, és ebben a kiadott parancsaink (a rendszer válaszaival együtt) szöveges formátumban elraktározódnak. A diary off hatására a szövegfájl záródik (és másolható, szállítható). | |||||||||||||||||||||||||||||||||||||||||||||||||
Próbálja ki a diary on opciót. A továbbiakban külön útmutató nélkül használjon belátása szerint naplózást. | |||||||||||||||||||||||||||||||||||||||||||||||||
A parancsablakban vagy direkt parancsokat, kifejezéseket közlünk, vagy az aktuális könyvtárban, vagy más elérhető könyvtárban található parancsköteg fájlra (ún. M-fájlra) hivatkozhatunk. Az M-fájlok a direkt parancsokon kívül programozási elemeket (iteráció, szelekció stb.) is tartalmazhatnak. Az M-fájlokat az Editor ablakban nyithatjuk meg, amely egy szövegszerkesztő segítségével támogatja a programírást. | |||||||||||||||||||||||||||||||||||||||||||||||||
Az Editor ablakbeli szövegszerkesztő a programozási elemeket színezéssel emeli ki a könnyebb áttekinthetőség érdekében. Az aktuális könyvtárbeli tridiag.m fájl segítségével egy sávmátrixot létrehozó függvényt adtunk meg a beépített ones() és diag() függvények segítségével (ezeket később tárgyaljuk): | |||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
Az olyan függvényekre, amelyek definíciós M-fájlja a MATLAB számára elérhető könyvtárban van, a munkánk során mindig hivatkozhatunk. A következő | |||||||||||||||||||||||||||||||||||||||||||||||||
>> ans | |||||||||||||||||||||||||||||||||||||||||||||||||
hivatkozás egy legális kifejezés, hiszen egy most már létező változóra hivatkozik, és mivel nincs mögötte (;) jel, ezért a kiértékelés eredménye azonnal megjelenik. Az ezt követő | |||||||||||||||||||||||||||||||||||||||||||||||||
>> inverz=inv(ans) | |||||||||||||||||||||||||||||||||||||||||||||||||
értékadó kifejezés a korábban létrehozott sávmátrix inverzét állítja elő és jeleníti meg. A megjelenítés alapértelmezés szerinti short formátumú, azaz 4 értékes jegyet látunk a tizedespont mögött. | |||||||||||||||||||||||||||||||||||||||||||||||||
A munkaterület ablakban (Workspace) láthatjuk a már létrehozott változóinkat és szerkeszthetjük a tartalmukat. A munkaterületen lévő változók parancsok segítségével | |||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
Az adatszerkesztő (Variable Editor) ablak akkor nyílik meg, ha a munkaterületi változóink valamelyikére duplán rákattintunk. Itt akár újabb sorokkal és oszlopokkal is bővíthetjük a mátrixainkat: | |||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
Az aktuális könyvtár ablakban (Current Folder) az ott elérhető fájlok listáját látjuk, míg a részletek ablakocskában (Details) az aktuális könyvtár kijelölt fájljára vonatkozó információkat találjuk. | |||||||||||||||||||||||||||||||||||||||||||||||||
A MATLAB-ból való kilépést a quit, vagy exit parancsokkal, illetve a File menüből is kezdeményezhetjük, de a CTRL+Q forróbillentyűvel is végrehajthatjuk. | |||||||||||||||||||||||||||||||||||||||||||||||||
Help rendszer | |||||||||||||||||||||||||||||||||||||||||||||||||
A MATLAB-bal végzett munkánk során fontos segítséget nyújt a Help (súgó) rendszer. Help információt alapvetően kétféle módon kérhetünk: szövegközben (a parancsablakba kiíratva) és önálló ablakban. | |||||||||||||||||||||||||||||||||||||||||||||||||
A szövegközi súgó alapvető tájékoztatást ad a választott parancsról/elemről (esetleg 1-2 példával), megmutatva azt, hogy melyek a kapcsolódó parancsok/elemek, és hol találunk még további, bővebb információt (a tartalom nem formázott). Hívás: help parancsnév. Például a help inv kiadása után a következőt látjuk a képernyőn: | |||||||||||||||||||||||||||||||||||||||||||||||||
>> help inv | |||||||||||||||||||||||||||||||||||||||||||||||||
A MATLAB külön ablakos, formázott, részletesebb tájékoztatást nyújtó könyvszerű súgója a Help browser. Aktiválása többféle módon is lehetséges. A doc vagy a helpdesk parancs elindítja a katalógusrendszerű, fa-struktúrájú súgót, és abban böngészhetünk a továbbiakban. | |||||||||||||||||||||||||||||||||||||||||||||||||
Ha már tudjuk a parancs vagy elem nevét, amiről a részletesebb információt szeretnénk kikérni, akkor a szintaktika: doc parancsnév (vagy helpwin parancsnév, utóbbi esetben valamivel kisebb terjedelmű lesz a leírás). Például a doc inv parancs kiadása után a következőt láthatjuk: | |||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
A Help browser sok példát is tartalmaz az adott parancs használatáról, és ezek a példák a MATLAB-ba beírva rögtön kipróbálhatók. Megjegyezzük még, hogy a Help browser MATLAB nélkül, csak az internetről is elérhető (mathworks.com oldal)! | |||||||||||||||||||||||||||||||||||||||||||||||||
Böngészéssel szerezzen információt a format parancs használatáról a Help browserben. | |||||||||||||||||||||||||||||||||||||||||||||||||
A MATLAB rengeteg beépített függvénye közül a mi alapozó kurzusunkban csak a legfontosabbakkal foglalkozunk, azaz a | |||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
függvények egy részével fogunk dolgozni. Bármelyik függvényt is szeretnénk használni, előtte érdemes a súgóban tájékozódni. Sok jó ötletet kaphatunk. | |||||||||||||||||||||||||||||||||||||||||||||||||
A MATLAB súgó használatának érdekes, speciális lehetőségét nyújtja a lookfor parancs. Ilyenkor egy fogalomra kerestethetünk a help rendszerben. Ez a lehetőség például akkor lehet hasznos, ha nem ismerjük a parancs pontos nevét, csak a név egy részletét. A válaszok közül bármelyiket választva, kinyílik annak a súgója. Például a format parancsra kerestetve több mint száz választ kapunk (következő ábra). | |||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
A lookfor parancs segítségével szerezzen információt a trigonometrikus függvények inverz függvényeiről a Help browserben. | |||||||||||||||||||||||||||||||||||||||||||||||||
A MATLAB Help browser beépített demo videókat is tartalmaz, amelyek a rendszer használatát, a környezetet és sok konkrét feladat megoldását is bemutatják. Érdekesek azok a videók is, amelyek az újabb MATLAB verziók új lehetőségeit ismertetik. | |||||||||||||||||||||||||||||||||||||||||||||||||
Értékadások, változók, kifejezések, formátumok | |||||||||||||||||||||||||||||||||||||||||||||||||
Használjuk először a MATLAB rendszert úgy, mint egy számológépet! Kíváncsiak vagyunk a gyök kettő értékére, és beírjuk a megfelelő parancsot. | |||||||||||||||||||||||||||||||||||||||||||||||||
>> sqrt(2) | |||||||||||||||||||||||||||||||||||||||||||||||||
Látjuk, hogy a rendszer alapértelmezésben 4 tizedesjegyre írta ki a - lebegőpontos, közelítő - választ. Ez a format short opciónak megfelelő output. Változtassuk meg ezt! | |||||||||||||||||||||||||||||||||||||||||||||||||
>> format long, a = sqrt(2) | |||||||||||||||||||||||||||||||||||||||||||||||||
A format long opcióval 15 tizedesjegyre kaptuk meg a lebegőpontos értéket. | |||||||||||||||||||||||||||||||||||||||||||||||||
A format parancs használatának praktikusan fontos esete még a felesleges soremelések letiltása a képernyőn. Ez a format compact kiadásával érhető el. (Az alapértelmezés a format loose beállítással állítható vissza.) | |||||||||||||||||||||||||||||||||||||||||||||||||
Tájékozódjon a format parancs további opcióiról a súgó rendszerben, és próbálja ki a lehetőségeket (e opció, hexadecimális kiíratás). | |||||||||||||||||||||||||||||||||||||||||||||||||
Ahogy már fent is láttuk, a rendszer válasza adott nevű változóba, vagy az "ans" rendszerváltozóba kerülhet. Ha az ans változó már kapott értéket, akkor ezzel a továbbiakban mi is dolgozhatunk. | |||||||||||||||||||||||||||||||||||||||||||||||||
Írassa ki a pi és az e nevezetes konstansok értékét 4, ill. 15 tizedesre. A legutolsó választ mentse el egy b változóba. Segítség: a MATLAB ismeri a pi változót adott néven. Az e konstans közelítő előállítására az exp függvényt használhatjuk. | |||||||||||||||||||||||||||||||||||||||||||||||||
Ezután már egyszerű kifejezések értékét is könnyen kiírathatjuk. | |||||||||||||||||||||||||||||||||||||||||||||||||
>> format short, a = pi; b = sqrt(2); a + b, a*b | |||||||||||||||||||||||||||||||||||||||||||||||||
Bár még csak az alapműveleteket "vetettük be", mégis, ha nem figyelünk megfelelően, elég hamar gondjaink támadhatnak. Például: | |||||||||||||||||||||||||||||||||||||||||||||||||
>> 6/0 | |||||||||||||||||||||||||||||||||||||||||||||||||
Az Inf a rendszer számára egy elméleti plusz végtelen érték (nagyobb, mint az ábrázolható legnagyobb szám, lásd később). Hasonlóan a -Inf is értelmezett, és a végtelenekkel is végezhető művelet. | |||||||||||||||||||||||||||||||||||||||||||||||||
>> 2*Inf, Inf - Inf | |||||||||||||||||||||||||||||||||||||||||||||||||
Az első válasz nem meglepő, a második viszont újra elgondolkodtat bennünket. A NaN a "Not a Number" kifejezésből rövidült, azt jelzi, hogy a MATLAB nem tudta az adott kifejezést számként értelmezni. (Matematikából tudjuk, hogy végtelenek különbsége, hányadosa sorozatok határértékeként tekintve tetszőleges érték lehet.) | |||||||||||||||||||||||||||||||||||||||||||||||||
Az Inf és a NaN szimbolikus értékeket mi is használhatjuk kifejezések megadásakor. A MATLAB kisbetű/nagybetű érzékeny (tehát számára A ? a), de itt enyhítést ad: az "Inf" kis kezdőbetűvel is megadható, és a "NaN" is beírható csupa kisbetűvel. | |||||||||||||||||||||||||||||||||||||||||||||||||
Mi lesz a következő műveletek eredménye: Inf+Inf, 3*Inf, -4*Inf, 0/100, 2/0, -2/0, NaN+Inf, NaN*Inf, NaN-NaN? | |||||||||||||||||||||||||||||||||||||||||||||||||
A számológépszintű használat következő lépéseként kifejezéseinkbe beépítjük az aritmetikai függvényeket is (a négyzetgyök függvényt már eddig is használtuk). A választ most is lebegőpontosan kapjuk meg. | |||||||||||||||||||||||||||||||||||||||||||||||||
>> cos(0), sin(pi/4) | |||||||||||||||||||||||||||||||||||||||||||||||||
Mi lesz a következő kifejezések eredménye a MATLAB-ban: sin(0), cos(pi/4). | |||||||||||||||||||||||||||||||||||||||||||||||||
A Súgó rendszerben tetszőleges - elemi - matematikai függvény használatának a szintaktikáját megnézhetjük. (A tallózó funkcióval még úgy is sikerre juthatunk, hogy kezdetben esetleg nem is ismerjük pontosan a függvény nevét.) | |||||||||||||||||||||||||||||||||||||||||||||||||
Tájékozódjon az elemi matematikai függvények használatáról (help elfun vagy doc elfun) a MATLAB súgóban. | |||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
Írassa ki a MATLAB-bal a koszinusz-hiperbolikusz függvény értékét a 0,1 helyen! | |||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
A kifejezések kiértékelésénél a zárójelezés, az aritmetikai műveletek erősorrendje (precedencia) és a balról jobbra szabály dönt. A precendencia szabályai szükség esetén a súgóban megnézhetők (előző ábra, a még nem tanult műveletekkel később foglalkozunk). | |||||||||||||||||||||||||||||||||||||||||||||||||
Mi lesz a következő kifejezések eredménye a MATLAB-ban: -2^3, 3^2 - (5 + 4)/2 + 6*3 | |||||||||||||||||||||||||||||||||||||||||||||||||
Talál-e felesleges zárójeleket a következő kifejezésekben: 2^(3^4), 2^(-3) | |||||||||||||||||||||||||||||||||||||||||||||||||
Ha pontos matematikai számítást szeretnénk végezni, akkor törteknél, trigonometrikus és logaritmikus kifejezéseknél zavaró lehet a MATLAB által használt numerikus kiértékelés. Ilyenkor lehetőség van szimbolikus számolásra is, a sym kulcsszó használatával. (A szimbolikus számítási modul nem tartozik hozzá a MATLAB alapfelszereltségéhez, egy Toolbox tartalmazza. Ezt a modult a Maple nyelv lehetőségei alapján fejlesztették ki, és később integrálták a MATLAB-ba.) | |||||||||||||||||||||||||||||||||||||||||||||||||
>> sin(2*pi/3), sin(sym('2*pi/3')) | |||||||||||||||||||||||||||||||||||||||||||||||||
Számolja ki a következő kifejezések értékét lebegőpontosan és szimbolikusan: sin(pi/3), cos(pi/3) | |||||||||||||||||||||||||||||||||||||||||||||||||
Az alfejezetet azzal zárjuk, hogy bemutatjuk a MATLAB-ban használható írásjeleket. Ezek a következők: | |||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||
A speciális jelek közül a műveleti jelek némelyikével már találkoztunk, mások a későbbiekben jönnek elő. A vessző és a pontosvessző szerepe szintén ismert már, a százalékjel után kommentár írható. A kettőspont a MATLAB-ban egy sorozatképző operátor. A három pont "..." karakter szerepe speciális: ezzel tudjuk az adott sorban el nem férő információ/parancs beírását egyéb törés nélkül másik sorban folytatni. | |||||||||||||||||||||||||||||||||||||||||||||||||
Próbálja ki, hogy magyar ékezetes betűk nem használhatók változók nevében. | |||||||||||||||||||||||||||||||||||||||||||||||||
A súgó segítségével próbálja kideríteni az utolsó sorban felsorolt jelek közül minél többnek a funkcióját (lásd pl. előző ábra). Készítsen jegyzeteket, hogy később ellenőrizhesse a tapasztalatait. | |||||||||||||||||||||||||||||||||||||||||||||||||
A MATLAB adattípusai | |||||||||||||||||||||||||||||||||||||||||||||||||
Numerikus típusok | |||||||||||||||||||||||||||||||||||||||||||||||||
Ahogy fent már említettük, a MATLAB alapértelmezésben lebegőpontos, double adattípust használ a szám típusú adatok tárolásához (ennek részleteit lásd: IEEE754 szabvány). Mondhatjuk, hogy az átlagos felhasználó legalább 95%-ban csak alapértelmezett numerikus típusokkal találkozik, de a maradék esetek kezelése olyan meglepetéseket tartogat, amelyekre célszerű felkészülni. | |||||||||||||||||||||||||||||||||||||||||||||||||
Nem double típusú változókat leggyakrabban típusmódosító utasításokkal (típuskényszerítéssel) hozunk létre. | |||||||||||||||||||||||||||||||||||||||||||||||||
>> a = int8(6) | |||||||||||||||||||||||||||||||||||||||||||||||||
Példánkban egy 8 bites előjeles egész változónak adtunk értéket, majd a whos paranccsal kilistáztattuk a munkaváltozókat. Az eredményből látható, hogy az "a" változót a rendszer az int8 osztályba sorolta. | |||||||||||||||||||||||||||||||||||||||||||||||||
A whos parancs az összes változó listázására szolgál, részletekkel (rokon parancsa a who, ilyenkor csak felsorolást kapunk a nevekről, részletek nélkül). Ha csak egyes változókra vagyunk kíváncsiak, akkor joker jeleket is bevethetünk, pl. whos a* - csak az "a" betűvel kezdődő változók listázására. (A változók törlésére többféle lehetőség is van, ezeket később tanuljuk.) | |||||||||||||||||||||||||||||||||||||||||||||||||
A lista alapján kézenfekvően adódik, hogy a size és a class függvények is használhatók a változók méretének és típusának lekérdezésére. | |||||||||||||||||||||||||||||||||||||||||||||||||
Próbálja ki a who és a whos parancsok használatát: hozzon létre a, b, c betűvel kezdődő nevű változókat és listázza ki őket. | |||||||||||||||||||||||||||||||||||||||||||||||||
Kérdezze le a létrehozott változók méretét és típusát a size, ill. a class paranccsal. | |||||||||||||||||||||||||||||||||||||||||||||||||
A kulcsszavak alapján az egész típusok azonosítása nagyon egyszerű: a felhasználható bitek száma mellett az "u" (unsigned) előtag jelzi azt, hogy előjel nélküli a típus. Így például az int8-nál már azonnal tudjuk, hogy 8 bites, előjeles tárolásról van szó, azaz a legkisebb ábrázolható szám a | |||||||||||||||||||||||||||||||||||||||||||||||||
Ismételje át az Informatika I. tárgyból szerzett ismereteit az egész és lebegőpontos adattárolásról. | |||||||||||||||||||||||||||||||||||||||||||||||||
Ha adott típusú változó legnagyobb értékéhez hozzá szeretnénk adni, vagy a legkisebb értékéből ki szeretnénk vonni, akkor a túlcsordulás jelenségével találkozunk, meglehetősen speciális módon ("teli pohár esete", az érték mindig a megfelelő korlát, de a rendszer külön nem jelzi a hibát!): | |||||||||||||||||||||||||||||||||||||||||||||||||
>> b = uint8(255), c = b + 1 | |||||||||||||||||||||||||||||||||||||||||||||||||
A 8 mellett 16 és 32 bit is lefoglalható az egészek számára, és mivel mindegyik típusból létezik előjeles és előjel nélküli változat is, ezért összesen hatféle különböző egész típust használhatunk. (Megjegyezzük, hogy a MATLAB emellett használja az int64 és uint64 típusokat is, de csak speciális, adminisztrációs célokra - pl. időmérés. A felhasználó ilyen típusú változóknak direkt módon nem adhat értéket.) | |||||||||||||||||||||||||||||||||||||||||||||||||
Próbálja ki a túlcsordulás jelenségét az int16 és uint16 típusoknál. | |||||||||||||||||||||||||||||||||||||||||||||||||
Hozzon létre különböző típusú egész változókat, és kérdezze le típusukat a class függvénnyel. | |||||||||||||||||||||||||||||||||||||||||||||||||
A valós típusoknál szűkebb a repertoár: a double mellett még a single egyszeres pontosságú lebegőpontos típus használható. | |||||||||||||||||||||||||||||||||||||||||||||||||
Az egyes tárolási típusok értékhatárait bemutatjuk a következő táblázatban. | |||||||||||||||||||||||||||||||||||||||||||||||||
Numerikus típusok tárolási határai
1. táblázat | |||||||||||||||||||||||||||||||||||||||||||||||||
Az intmin() és az intmax() parancs használatával lekérhetjük az adott típus tárolási határait. | |||||||||||||||||||||||||||||||||||||||||||||||||
>> intmax('uint32') | |||||||||||||||||||||||||||||||||||||||||||||||||
A parancsok valós megfelelője a valós típusokra is használható (lásd táblázat), de vigyázzunk, itt a realmin() nem a típus legkisebb elemét adja vissza! (A legkisebb ábrázolható valós számok értelemszerűen a realmax() függvény által adott válaszok -1-szeresei.) | |||||||||||||||||||||||||||||||||||||||||||||||||
Jegyezze meg az előző táblázatban adott határok nagyságrendi értékét! | |||||||||||||||||||||||||||||||||||||||||||||||||
Önállóan derítse fel, hogy milyen tulajdonságú szám a realmin() függvény outputja! | |||||||||||||||||||||||||||||||||||||||||||||||||
Különböző egész és valós típusok használatakor mindig fel kell készülnünk a konverziók hatására fellépő veszteségekre (tárolási lehetőség, tárolási határok, fent már láttuk), ill. esetlegesen a művelet elvégezhetetlenségére is! | |||||||||||||||||||||||||||||||||||||||||||||||||
>> a = int8(pi), b = int16(123456789) | |||||||||||||||||||||||||||||||||||||||||||||||||
A példában láthatjuk, hogy az "a" változó csak a pi szám egész értékét kaphatta meg, a "b" változóba pedig a várt nagy szám helyett a típus felső határa került. Az "a + b" összeadás nem végezhető el, mert különböző egész típusok között a MATLAB a műveleteket nem engedélyezi. Double típusú változóhoz már hozzáadható egész típusú változó, ilyenkor az eredmény típusa is az utóbbi lesz. | |||||||||||||||||||||||||||||||||||||||||||||||||
Próbáljon negatív értéket elhelyezni előjel nélküli egész típusban! Mit tapasztal? | |||||||||||||||||||||||||||||||||||||||||||||||||
Végezze el a következő műveletet: uint8(3)/uint8(5). Próbáljon ki más hasonló példákat is! Írja le a tapasztalatait! | |||||||||||||||||||||||||||||||||||||||||||||||||
Valós típusoknál is történhet túlcsordulás, a rendszer válasza ilyenkor a szimbolikus végtelen. | |||||||||||||||||||||||||||||||||||||||||||||||||
>> realmax('double')*1.1 | |||||||||||||||||||||||||||||||||||||||||||||||||
A tárolási típusok határai és a közönséges, ill. az extra "számok" tárolási logikája (az IEEE szabvány szerint) jól áttekinthető, ha hexadecimális megjelenítésre kapcsolunk át. | |||||||||||||||||||||||||||||||||||||||||||||||||
>> nulla = 0, egy = 1, pi = pi | |||||||||||||||||||||||||||||||||||||||||||||||||
Önálló kísérletezéssel szerezzen további tapasztalatokat különböző értékek tárolásáról. | |||||||||||||||||||||||||||||||||||||||||||||||||
Végezetül megemlítjük, hogy a gépi epszilon a MATLAB rendszerben beépített változóként használható. | |||||||||||||||||||||||||||||||||||||||||||||||||
>> eps | |||||||||||||||||||||||||||||||||||||||||||||||||
Látjuk, hogy az kifejezés a MATLAB számára még nem pontosan 1, ugyanakkor az már igen. (A hasonlító művelet bemutatását lásd lent, a logikai adatoknál.) | |||||||||||||||||||||||||||||||||||||||||||||||||
Ugyanez a jelenség hexadecimális megjelenítésben: | |||||||||||||||||||||||||||||||||||||||||||||||||
>> format hex, epszilon = eps | |||||||||||||||||||||||||||||||||||||||||||||||||
Keresse meg azt a legkisebb pozitív számot, amire még éppen nagyobb 2-nél! Mit vár, nagyobb lesz -nál? | |||||||||||||||||||||||||||||||||||||||||||||||||
Szöveges típusok | |||||||||||||||||||||||||||||||||||||||||||||||||
A MATLAB-ban sztringeket (karakterláncokat) aposztrófok között, a szokásos módon adhatunk meg. | |||||||||||||||||||||||||||||||||||||||||||||||||
>> x = 'áÁéÉíÍóÓöÖőŐúÚüÜűŰ$' | |||||||||||||||||||||||||||||||||||||||||||||||||
A rendszer a szöveges adatokat az írásjelek ASCII kódjaival egy sorvektorban tárolja (karakterenként 2 bájt lefoglalásával). A tárolási logika egyszerűen ellenőrizhető. A következő példában az írásjelkódok sorvektorával egy aritmetikai "null-műveletet" végzünk (ez esetben viszont már double típusú lesz az eredmény, hacsak nem kérünk más, megadott egész típust). | |||||||||||||||||||||||||||||||||||||||||||||||||
>> szoveg = 'Matlab', szoveg + 0 | |||||||||||||||||||||||||||||||||||||||||||||||||
ASCII kódok listájából is készíthetünk karakterláncot a char függvény alkalmazásával. Karakterláncra alkalmazva a függvény null-művelet. | |||||||||||||||||||||||||||||||||||||||||||||||||
>> char(65), char([65, 66]), char('B') | |||||||||||||||||||||||||||||||||||||||||||||||||
Adja meg azt a karakterláncot, amelynek karaktereit a következő ASCII kódsorozat azonosítja: | |||||||||||||||||||||||||||||||||||||||||||||||||
Több karakterlánc egy sorvektorba elhelyezve, azok összeragasztását eredményezi: | |||||||||||||||||||||||||||||||||||||||||||||||||
>> p = 'Maci'; q = 'Laci'; [p q] | |||||||||||||||||||||||||||||||||||||||||||||||||
A karakterekkel és karakterláncokkal egyéb megszokott műveletek is elvégezhetők. A következő példában a sorozatképző operátorral előállítjuk az angol ábécé nagybetűinek karakterláncát, majd ebből kiindulva a kisbetűk karakterláncát. | |||||||||||||||||||||||||||||||||||||||||||||||||
>> U = char('A':'Z'), diff = 'a' - 'A', L = char(U + diff) | |||||||||||||||||||||||||||||||||||||||||||||||||
A "diff" változó értéke a kis- és a nagybetűk ASCII kódja közötti különbség, ezt használtuk fel a konstrukciónál. | |||||||||||||||||||||||||||||||||||||||||||||||||
Karakterláncok manipulálásánál fontos még a length() függvény, amely a paraméterként megadott sztring hosszát adja vissza. | |||||||||||||||||||||||||||||||||||||||||||||||||
Szöveges adatot többféle célra használ a MATLAB. Az egyik és nyilvánvaló célja a kiírandó szöveg előállítása, tárolása, kiírása. A másik cél a begépelt képletek szövegszerű letárolása, majd elemzése, illetve végrehajtása. (A szövegként tárolt képlet az eval() függvény segítségével értékelhető ki, illetve hajtatható végre.) Minderről még később is lesz szó. | |||||||||||||||||||||||||||||||||||||||||||||||||
Komplex számok | |||||||||||||||||||||||||||||||||||||||||||||||||
A MATLAB a komplex számokat is kezelni tudja, ha azokat normál alakban adták meg: 4 + 3i. Az i szimbólum mellett a j szimbólum is (ezt a villamosmérnökök szeretik) az imaginárius egységet jelöli. | |||||||||||||||||||||||||||||||||||||||||||||||||
>> z = 4 + 3i, z', abs(z), z*z' | |||||||||||||||||||||||||||||||||||||||||||||||||
Példánkban az első értékadó kifejezés a "z" változóhoz rendelt egy komplex értéket, az abs(z) függvényhívás előállította a komplex szám abszolút értékét, a harmadik művelet pedig ennek a négyzetét. Itt találkoztunk először a változó mögé írt nagyon fontos (') aposztróf műveleti jellel, amely egy mátrix konjugált transzponáltját állítja elő. Itt viszont az 1×1 méretű mátrix (skalár) esetében persze ez csak a konjugálást jelenti. | |||||||||||||||||||||||||||||||||||||||||||||||||
Az i szimbólum nem keveredik össze az "i" változóval, a használat módja dönti el az értelmezést. Ha az i azonosítót még nem használtuk változó tárolására, akkor a következő írásmódok használhatók: | |||||||||||||||||||||||||||||||||||||||||||||||||
>> z = 4 + 3i, w = 4 + 3*i % mögé írva és szorzásjellel is jó | |||||||||||||||||||||||||||||||||||||||||||||||||
Ha viszont az i már értéket kapott, akkor a szorzásjel már a változóra vonatkozik. | |||||||||||||||||||||||||||||||||||||||||||||||||
>> i = 10; z = 4 + 3i, w = 4 + 3*i | |||||||||||||||||||||||||||||||||||||||||||||||||
Ez a példa jól mutatja azt a kellemetlenséget, amely a megszokott ciklusváltozók használatából eredően programozó "vénájú" embereknél a MATLAB használata során előfordulhat. | |||||||||||||||||||||||||||||||||||||||||||||||||
Az exponenciális függvény segítségével exponenciális alakban is megadhatjuk a komplex számot, amit a MATLAB normál alakra hoz, és ezzel az alakkal számol tovább. Az átalakítás szabálya: | |||||||||||||||||||||||||||||||||||||||||||||||||
ahol R a komplex szám abszolút értéke és a radiánban mért szöge. | |||||||||||||||||||||||||||||||||||||||||||||||||
Az exponenciális alakot az argumentumbeli i-vel szorzás miatt csak akkor használhatjuk, ha i-nek nincs változó szerepe. Ha mégis használjuk, akkor a komplex használat előtt mentjük az értéket, majd felszabadítjuk a változót, és a komplex használat után visszatöltjük. | |||||||||||||||||||||||||||||||||||||||||||||||||
>> i_save = i, clear i; z=2*exp(i*pi/4), i=i_save, w=2*exp(i*pi/4) | |||||||||||||||||||||||||||||||||||||||||||||||||
A clear paranccsal a munkaterületi változóinkat egyesével vagy csoportosan törölhetjük: | |||||||||||||||||||||||||||||||||||||||||||||||||
clear i, % csak az i változót törli | |||||||||||||||||||||||||||||||||||||||||||||||||
Természetesen a Workspace ablakbeli kiválasztott változókat az ablakbeli delete művelettel is törölhetjük, sőt, egyes speciális esetekben csak ez lehetséges. (Próbáljuk meg a clear = pi; értékadás után a clear változót másképp törölni!) | |||||||||||||||||||||||||||||||||||||||||||||||||
Próbálja ki a clear parancs használatát: a fent létrehozott a, b, c betűvel kezdődő nevű változókat törölje csoportosan. | |||||||||||||||||||||||||||||||||||||||||||||||||
A komplex számokkal való munkát további függvények is támogatják. Ilyenek például az isreal(), | |||||||||||||||||||||||||||||||||||||||||||||||||
>> fi = 60, r = 10, z = r*exp(i*fi*pi/180), valos_e = isreal(z), ... | |||||||||||||||||||||||||||||||||||||||||||||||||
Kockás füzetébe rajzoljon egy koordináta rendszert és vegyen fel vektorként néhány komplex egész számot. Próbálja ki a fent megismert parancsokat a komplex számok valós és komplex részének, ill. konjugáltjának és abszolút értékének a meghatározásához. Ellenőrizze az eredményeket a rajz alapján. | |||||||||||||||||||||||||||||||||||||||||||||||||
Dátum és idő típusú adatok | |||||||||||||||||||||||||||||||||||||||||||||||||
A dátum és idő típusú adatok tárolására a MATLAB double típusban tárolt valós számot használ, a logika hasonló az Excelhez. A napok egyesével növekedő sorszámot kapnak, a rendszer belső naptárában az 1. nap a 0000. január 1. A napon belüli időpontot törtszámokkal adhatjuk meg, például 0.625 a délután 3 órának felel meg. | |||||||||||||||||||||||||||||||||||||||||||||||||
A dátum-idő megjelenítése szintén az Excelhez hasonlóan sokféle lehet. | |||||||||||||||||||||||||||||||||||||||||||||||||
Konkrét dátum vagy idő sorszámmá alakítására a datenum() függvény használható. | |||||||||||||||||||||||||||||||||||||||||||||||||
>> datenum(1000, 1, 1) | |||||||||||||||||||||||||||||||||||||||||||||||||
Határozza meg a MATLAB segítségével, hogy hány napos ma! | |||||||||||||||||||||||||||||||||||||||||||||||||
A now() függvény a pillanatnyi dátum-időt adja vissza, amit a datevec() és datestr() függvényekkel átalakíthatunk. A datevec() függvény év, hó, nap, óra, perc, másodperc elemű double tárolású elemeket tartalmazó sorvektort állít elő: | |||||||||||||||||||||||||||||||||||||||||||||||||
>> most=now(), dt_str=datestr(most), dt_vec=int16(datevec(most)) | |||||||||||||||||||||||||||||||||||||||||||||||||
A datevec() double megjelenítését 2 bájtos tárolású egészre konvertálással kerültük ki. A dt_vec-hez hasonló sorvektort eredményez a clock beépített változó is: | |||||||||||||||||||||||||||||||||||||||||||||||||
>> int16(clock) | |||||||||||||||||||||||||||||||||||||||||||||||||
Az idő típusú adatok alkalmazásának gyakorlati szempontból talán legfontosabb "terepe" a programok futási idejének mérése. Az időmérést belső változók, műveletek (tic, toc, cputime) támogatják. Következő példánkban "rabszolgamunkára" kényszerítjük a MATLAB rendszert, 100-100 millió aritmetikai művelet ciklikus végrehajtásával (a for ciklus használatát a VBA részből ismertnek tekintjük, a Matlab-szintaktika a súgóban megtekinthető): | |||||||||||||||||||||||||||||||||||||||||||||||||
>> x = sqrt(3); tic, for i = 1:10^8 x = x + 1.0000001; end, toc; | |||||||||||||||||||||||||||||||||||||||||||||||||
Látható, hogy az összeadás és szorzás műveleti időigénye közel azonos, az osztásé lényegesen több (nagyjából háromszoros). | |||||||||||||||||||||||||||||||||||||||||||||||||
Logikai értékek | |||||||||||||||||||||||||||||||||||||||||||||||||
A logikai igaz és hamis értékek tárolására (1 bájton) a szokásos 1 és 0 numerikus értékeket használja a MATLAB. | |||||||||||||||||||||||||||||||||||||||||||||||||
>> 'Matlab' == 'Matek ' % karakterkódok páronkénti hasonlítása | |||||||||||||||||||||||||||||||||||||||||||||||||
Itt az == műveleti jellel (C-s szintaktika) két azonos méretű sorvektort karakterenként hasonlítottunk össze, az eredmény egy ugyanilyen méretű sorvektorba került. Más hasonlító műveletek a megszokott módon írhatók, egyedül a ~= (nem egyenlő) szintaktikája lehet meglepő. (A hasonlításokkal még a következő leckében is foglalkozunk.) | |||||||||||||||||||||||||||||||||||||||||||||||||
Az 1 és 0 logikai, illetve numerikus értékek a true és false alapszavakkal is megadhatók és hivatkozhatók: | |||||||||||||||||||||||||||||||||||||||||||||||||
>> x = true, 3 + x | |||||||||||||||||||||||||||||||||||||||||||||||||
Szövegek azonosságát viszont egyetlen válaszként az strcmp() függvénnyel kaphatjuk meg: | |||||||||||||||||||||||||||||||||||||||||||||||||
>> strcmp('Matlab','Matek') | |||||||||||||||||||||||||||||||||||||||||||||||||
Numerikus értékek, sőt mátrixok is kiértékelhetők logikailag. Skalár esetében minden nem 0 érték igaznak számít, és csak a 0 számít hamisnak (az if-then-else szerkezet használatát a VBA részből szintén ismertnek tekintjük, a Matlab-szintaktika a súgóban megtekinthető): | |||||||||||||||||||||||||||||||||||||||||||||||||
>> a = 5, if a fprintf('igaz\n'); else fprintf('hamis\n'); end; | |||||||||||||||||||||||||||||||||||||||||||||||||
Mátrix esetében csak akkor true a logikai eredmény, ha minden eleme nem 0, egyébként false a logikai érték. | |||||||||||||||||||||||||||||||||||||||||||||||||
>> A = [1 0; 2 3], if A fprintf('igaz\n'); else fprintf('hamis\n'); end; | |||||||||||||||||||||||||||||||||||||||||||||||||
Változók, védett alapszavak | |||||||||||||||||||||||||||||||||||||||||||||||||
Az adattípusokhoz kapcsolódóan ismertetjük a MATLAB-ban használható azonosítókra vonatkozó szabályokat. | |||||||||||||||||||||||||||||||||||||||||||||||||
A MATLAB változói betűvel kezdődő betűszámsorok lehetnek, viszont a kulcsszavak védettek (break, case, colon, continue, else, elseif, end, for, if, otherwise, switch, while). Ha mégis megpróbálunk egy ilyen "nevű" változónak értéket adni, akkor a művelet nem lesz sikeres: | |||||||||||||||||||||||||||||||||||||||||||||||||
>> break = pi % a break nem lehet legális változónév | |||||||||||||||||||||||||||||||||||||||||||||||||
A további gyakori parancsszavakat, függvényeket, belső változókat sem célszerű adatazonosítóként felhasználni - bár ez technikailag megengedett (pl. clear, dir, exit, format, help, load, save, eps, realmin, realmax, intmin, intmax, pi, inf, nan, ...). | |||||||||||||||||||||||||||||||||||||||||||||||||
Ha ez utóbbiak közül valamelyiket, pl. a dir-t változóként felhasználtuk, akkor az eredeti funkcióját nem tudjuk mindaddig használni, amíg a változóként nem töröltük (a clear dir parancsot kiadjuk, vagy a workspace ablakban töröljük). | |||||||||||||||||||||||||||||||||||||||||||||||||
Próbálja ki, hogy ha a "clear" nevet változóként lefoglalja, akkor az a clear clear szintaktikával már nem törölhető! Hajtsa végre a törlést a workspace ablakból! | |||||||||||||||||||||||||||||||||||||||||||||||||
Fontos, hogy a változóinkat célszerű nevekkel azonosítsuk, mert nagyobb munkák esetén ezeket már nehéz áttekinteni. | |||||||||||||||||||||||||||||||||||||||||||||||||
A MATLAB a C-nyelvekhez hasonlóan különbséget tesz a kisbetűk és a nagybetűk között, ez pedig a kezdő alkalmazóknál sokszor okoz megfejthetetlennek tűnő hibaüzeneteket. | |||||||||||||||||||||||||||||||||||||||||||||||||
>> z = 3; Z |
Önellenőrző kérdések | ||||
1. Mennyi decimális számjegyet jelezhetünk ki maximum a törtrészben a format long parancs kiadása után? ![]() | ||||
2. Melyik egész típusú adatokkal nem lehet aritmetikai műveleteket elvégezni? ![]() | ||||
3. Milyen nagyságrendű a realmax('double') értéke? ![]() | ||||
4. Lehet-e a pi azonosító változó? Ha igen, akkor írjuk fel azt az értékadást, amely után a helyes érték tárolódik! ![]() | ||||
5. Igaz-e, hogy egyetlen numerikus értéket a MATLAB skaláris típusú változóban tárol? ![]() | ||||
6. Ha z 1×1-es mátrix, akkor mennyi lesz az angle(z) + angle(z') kifejezés értéke? ![]() | ||||
7. Legyen z = 3 + 4i. Mennyit ér a z* z' ? ![]() | ||||
8. Lehet-e a clear=2013; értékadás után a clear változót a clear paranccsal törölni? ![]() | ||||
9. A MATLAB rendszer használata nélkül válaszoljon a következő kérdésekre! | ||||
Mi lesz a következő művelet eredménye? Inf+Inf ![]() | ||||
Adja meg azt a parancsot, amivel a munkakönyvtára beállíthatjuk a d: meghajtó gyökéren belüli munka nevű könyvtárba! A kérdéses könyvtárat előzőleg fizikailag már létrehoztuk. ![]() | ||||
Adja meg azt a parancsot, amivel kilistáztathatjuk az e betűvel kezdődő létező változókat! ![]() | ||||
Rendezze növekvő sorrendbe a következő értékeket!
![]() | ||||
Mi lesz a MATLAB válasza a következő parancs kiadása után? >> char(65) ![]() |