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)

  • be- és ki tudja kapcsolni a rendszer ablakait, ki tud alakítani magának egy megfelelő munkakörnyezetet;
  • parancsait szöveges fájlba tudja menteni és korábban kiadott parancsait szükség esetén vissza tudja tölteni;
  • képes keresni és navigálni a súgó rendszerben;
  • tudja használni az alapvető format parancsokat, képes változók létrehozására, kilistázására, tulajdonságaik lekérdezésére és törlésükre;
  • nagyságrendileg a MATLAB segítsége nélkül is meg tudja adni a numerikus tárolási típusok értékhatárait;
  • tudja kezelni a numerikus típusok ábrázolási korlátaiból eredő tanult problémákat (túlcsordulás, konverziók);
  • képes alapvető műveleteket végezni szöveges adatokkal, komplex számokkal, idő, dátum és logikai adatokkal, tudja alkalmazni a leckében bemutatott függvényeket.

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

  • MATLAB parancsablak (Command window), előzmények (History), munkaterület (Workspace);
  • Változók, kifejezések, megjelenési formátum, precedencia;
  • Elemi matematikai függvények;
  • Numerikus, szöveges, komplex, dátum-idő, logikai típusok és műveleteik;
  • Egyszerű típus- és adatmanipulációs függvények (pl. class, size, whos);
  • Tárolási határok.
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:

  • Fejlesztői és futtatói környezet (adat és szövegszerkesztő, parancsablak, hibakereső eszközök, előzmények ablaka, munkakönyvtár katalógus stb.);
  • Grafikai szemléltető apparátus;
  • Magas szintű programozási nyelv;
  • Függvénykönyvtárak;
  • ToolBox-ok (speciális alkalmazási bővítmények);
  • Help (súgó).

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.

  • Interaktív (parancsvezérelt) környezet: Ilyenkor a MATLAB valójában egy interpreter, amely a feltett kérdésekre (parancs, kifejezés, ...) azonnal válaszol. A rendszerben több száz beépített parancs használható és az eligazodást rengeteg beépített mintapélda segíti. Bár az interaktív szintű használat nagyon sok esetben elég az adott probléma megoldására, mégis, ezt a működési módot tipikusan csak egyszerűbb feladatok esetén használjuk.
  • Hatékonyabb, kötegelt végrehajtást tesz lehetővé az M-fájlok (vagy scriptek) használata, amikor a felhasználó egy szövegszerkesztő segítségével a MATLAB programnyelvi elemeit használva megírja a saját programját, és ezt később az interpreter segítségével lefuttatja. Az M-fájlok ténylegesen .m kiterjesztésű szöveges fájlok, amelyek MATLAB programkódot tartalmaznak.
  • Programozás: A MATLAB saját, a rendszerre optimalizált (és ezért nagyon hatékony) programozási nyelvén nagyméretű programok is készíthetők, és biztosított az átjárás más rendszerek (pl. C) felé.

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
https://sites.google.com/site/guioctave/download
http://sourceforge.net/projects/octave/files

Online Octave ablak, végrehajtott MATLAB parancsokkal
1. ábra
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 MATLAB névjegye
2. á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 MATLAB szokásos ablakai
3. ábra

A szokásos ablakok (alapbeállítás esetén megnyílók, lásd ábra):

  • Current Folder - aktuális könyvtár és fájljai;
  • Details - aktuális könyvtárbeli kijelölt fájl információi;
  • Command Window - parancsablak, parancsok begépelésének és a rendszerválaszok helye;
  • Workspace - munkaterületi változók;
  • Command History - parancselőzmények.

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):

  • Editor;
  • Figure Window/Editor;
  • Help;
  • Variable Editor.

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):

Szerkesztő ablak (függvények, M-fájlok)
4. ábra

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

  • felülírhatók (értékadó kifejezés),
  • fájlba menthetők és visszatölthetők (save, load stb. parancsok és függvények),
  • részben vagy teljesen törölhetők (clear parancs).

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:

Adatszerkesztő ablak (mátrixok)
5. ábra

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
INV  Matrix inverse.
  INV(X) is the inverse of the square matrix X.
  A warning message is printed if X is badly scaled or nearly singular.
  See also slash, pinv, cond, condest, lsqnonneg, lscov. ...
  Reference page in Help browser
      doc 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:

Tájékoztatás az inv parancsról (Help browser)
6. ábra

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

  • Matematikai;
  • Adatelemzést végző;
  • Grafikai;
  • Input, output

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 format keresés eredményei (részlet)
7. á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)
ans =    1.4142

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 =    1.414213562373095

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
ans =    4.5558
ans =    4.4429

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
Warning: Divide by zero
ans =  Inf

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
ans =  Inf
ans =  NaN

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 tényleges kipróbálás előtt írja le a füzetébe a várható eredményt!

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)
ans =    1
ans =    0.7071

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.

Elemi matematikai függvények (részlet a súgóból)
8. ábra

Írassa ki a MATLAB-bal a koszinusz-hiperbolikusz függvény értékét a 0,1 helyen!
Írassa ki a MATLAB-bal az arkusz tangens függvény értékét a 0,5 helyen!

Precedencia a MATLAB súgóban
9. ábra

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'))
ans =    0.8660
ans = 3^(1/2)/2

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:

  • Az angol abc kis és nagybetűi, amelyek között a MATLAB különbséget tesz (sztringekben, kommentárokban használhatók magyar ékezetes betűk);
  • Számjegyek;
  • Space;
  • Speciális jelek: _ . , : ; < > / \ * ^ ~ = ( ) [ ] { } ' ! @ & | %

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)
a =    6
>> whos
  Name      Size            Bytes  Class    Attributes
  a        1x1                1  int8             
  ans      1x1                8  double           

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
-128, a legnagyobb pedig a +127. Hasonlóan, az uint8 típus (előjel nélküli egészek 8 biten) legkisebb eleme a 0, legnagyobb eleme pedig a 255.

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
b =  255
c =  255

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
típusintmin('típus')intmax('típus')bájt
int8-1281271
uint802551
int16-32768327672
uint160655352
int32-214748364821474836474
uint32042949672954
int64-922337203685477580892233720368547758078
uint640184467440737095516158
 realmin('típus')realmax('típus')
single1.175494e-0383.402823e+0384
double2.2250738585072e-3081.79769313486232e+3088

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')
ans =  4294967295

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 =    3
b =  32767
>> a + b
??? Error using ==> plus
Integers can only be combined with integers of the same class, or scalar doubles.
>> c = a + pi
c =    6
>> class(c)
ans = int8

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
ans =  Inf

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
nulla =
  0000000000000000
egy =
  3ff0000000000000
pi =
  400921fb54442d18
>> vegtelen = Inf, nem_szam = NaN  % Inf-re és NaN-ra: speciális kódok
vegtelen =
  7ff0000000000000
nem_szam =
  fff8000000000000
>> uint16max = intmax('uint16'), int32max = intmax('int32'% határok
uint16max =
  ffff
int32max =
  7fffffff

Ö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
ans =    2.220446049250313e-016
>> 1 + eps, 1 + eps/2
ans =  1.000000000000000
ans =    1
>> 1 + eps/2 == 1
ans =    1

Látjuk, hogy az 1+ε kifejezés a MATLAB számára még nem pontosan 1, ugyanakkor az 1+ε/2 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
epszilon =
  3cb0000000000000
>> egy = 1
ans =
  3ff0000000000000
>> egy + epszilon
ans =
  3ff0000000000001

Keresse meg azt a legkisebb pozitív ε 2 számot, amire 2+ ε 2 még éppen nagyobb 2-nél! Mit vár, ε 2 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 = 'áÁéÉíÍóÓöÖőŐúÚüÜűŰ$€'
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
szoveg = Matlab
ans =
  77  97  116  108  97  98
>> whos
  Name        Size            Bytes  Class    Attributes
  ans        1x6                48  double           
  szoveg      1x6                12  char             

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')
ans = A
ans = AB
ans = B

Adja meg azt a karakterláncot, amelynek karaktereit a következő ASCII kódsorozat azonosítja:
w = [104  101  108  108  111    32  119  111  114  108  100  33]

Több karakterlánc egy sorvektorba elhelyezve, azok összeragasztását eredményezi:

>> p = 'Maci'; q = 'Laci'; [p q]
ans = MaciLaci

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)
U = ABCDEFGHIJKLMNOPQRSTUVWXYZ
diff =    32
L = abcdefghijklmnopqrstuvwxyz

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'
z = 4.0000 + 3.0000i
ans =  4.0000 - 3.0000i
ans = 5
ans = 25

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ó
z = 4.0000 + 3.0000i
w = 4.0000 + 3.0000i

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
z = 4.0000 + 3.0000i
w = 34

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:

Rexp(iφ)=Rcos( φ )+i( Rsin( φ ) )

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)
i_save = 10
z = 1.4142 + 1.4142i
i = 10
w = 5.1519e+003

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
clear z*,  % csak a z-vel kezdődő azonosítójú változókat törli
clear      % az összes munkaterületi 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(),
real(), imag(), conj(), angle(). A nevek beszédesek, a műveletek a matematikából már ismertek.

>> fi = 60, r = 10, z = r*exp(i*fi*pi/180), valos_e = isreal(z), ...
a=real(z), z_konjug=conj(z), abs_z=abs(z), alfa_rad = angle(z), ...
alfa_fok = alfa_rad/pi*180
fi = 60
r = 10
z = 5.0000 + 8.6603i
valos_e = 0
a = 5.0000
z_konjug = 5.0000 - 8.6603i
abs_z = 10
alfa_rad = 1.0472
alfa_fok = 60

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)
ans =      365244

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))
most =  7.3581e+005
dt_str = 01-Aug-2014 18:02:35
dt_vec =
  2014      8      1    18      2    36

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)
ans =
  2014      8      1    18      3    45

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;
x = sqrt(3); tic, for i = 1:10^8 x = x*1.0000001; end, toc;
x = sqrt(3); tic, for i = 1:10^8 x = x/1.0000001; end, toc;
Elapsed time is 1.528049 seconds.
Elapsed time is 1.521122 seconds.
Elapsed time is 4.698885 seconds.

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
ans =
    1    1    1    0    0    0
>> whos ans
  Name      Size            Bytes  Class      Attributes
  ans      1x6                6  logical

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
x = 1
ans = 4

Szövegek azonosságát viszont egyetlen válaszként az strcmp() függvénnyel kaphatjuk meg:

>> strcmp('Matlab','Matek')
ans = 0

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;
a = 5
igaz

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;
A =
    1    0
    2    3
hamis
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
??? break = pi
          |
Error: The expression to the left of the equals sign is not
a valid target for an assignment.

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
??? Undefined function or variable '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!

1.
2.
3.
4.
5.


Mi lesz a MATLAB válasza a következő parancs kiadása után?

>> char(65)
ans =



>> char(char('A'))
ans =