A MATLAB programozási nyelv

Típusok, típuskonstrukciók



Típusok

A MATLAB-ban 16 alapvető adattípus található, melyek majdnem mindegyikéből képezhetünk mátrixokat (kivételt jelent a függvényre mutató referencia típusa). Sőt ha egy elem tárolására hozunk létre egy változót a MATLAB azt is (1x1-es) mátrixként kezeli.

A mátrixokat az alábbi módokon adhatjuk meg:

Numerikus Típusok

MATLAB-ban hasonlóan a programozási nyelvek többségéhez rendelkezésre állnak előjeles és előjelnélküli egészek, valamint egyszeres és kétszeres pontosságú lebegőpontos számok, valamint megtalálható a komplex szám típus is. A numerikus adatok tárolására a következő ábrázolások közül választhatunk:

Alapértelmezésként az összes numerikus érték duplapontosságú lebegőpontos ábrázolással kerül tárolásra, de megadható, hogy milyen ábrázolást használjon a MATLAB az adott érték tárolására. pl. az x = 325; esetén x típusa double, de ha mondjuk mi int16-ként szeretnénk tárolni, akkor a következő konverziót kell végre hajtani x = int16(325); , de minden probléma nélkül konvertálhatunk akár egy stringet egésszé.

pl. str = 'Hello World';
int8(str)
ans =
72 101 108 108 111 32 87 111 114 108 100

Abban az esetben, ha egy bináris operátor egyik operandusa egész, vagy egész tömb a másik pedig double skalár akkor a MATLAB elemenként dupla pontosságú aritmetikát használ aztán konvertálja az eredményt. A komplex számok megadása a következőképen történik: x = 2+3i; , de az i helyett a j is használható.

Logikai Típus

A MATLAB a logikai igaz és hamis állítások reprezentálására a 0 és 1 értékeket használja. Természetesen logikai értékek is mátrixként tárolódnak. Létrehozhatunk logikai tömböt pl.: x = [true, true , true , false, false]; utasítással vagy pl. a x = [10, 45, 78, 34] > 40; kifejezéssel.

Karakter és String Típus

MATLABban a string típus unicode karakterek tömbjének felel meg. Ha stringekből szeretnénk tömböt létrehozni ami egy karakter mátrix, akkor arra kell oda figyelni, hogy mindegyik string hossza ugyanakkora legyen. pl. x = ['str1 ', 'string2'] vagy ehelyett használhatjuk a char('str1','string2') függvényt ami elvégzi a kiegészítést. Ha egy tömbben valóban eltérő hosszúságú stringeket akarunk tárolni akkor cella tömböt kell használni.

Stringek összehasonlításához a strcmp -függvényt kell használni mivel a == operátor karakterenként végzi el az összehasonlítást így a 'str1' == 'str2' eredménye [ 1 1 1 0] tömb.

Dátum és Idő Típus

A dátumok és idő reprezentálására a MATLAB-ban három reprezentációt használ, ezek: a dátum string, numerikus, vagy dátum vektor. A felhasználó választása, hogy melyiket használja, és természetesen a különböző reprezentációkra való konvertálásra függvények állnak rendelkezésre.

pl.: Date string: 02-Oct-1996
Serial date: number 729300
Date vector: 1996 10 2 0 0 0

Talán a legegyszerűbb módja a dátum kezelésnek a dátum stringek, használata, amelyekkel több formátumban is reprezentálhatjuk az időpontokat, valamint a MATLAB dátum függvényei is ilyen reprezentációval térnek vissza. például a 2003 oct. 31 15:45:17 időpontot lehetséges ábrázolásai:

31-Oct-2003 15:45:17
10/31/03
15:45:17
03:45:17 PM

A numerikus reprezentáció jól jöhet ha nagy mennyiségű dátummal dolgozunk, és hatékonyan szeretnénk számolni. Ebben a reprezentációban az 1 jelenti a 0000 január 1.-et, és törtszámokkal adhatunk meg időpontot pl. 0,75 a délután 6 órának felel meg. Így a 31-Oct-2003, 6:00 pm string a 731885.75 számnak felel meg. A now függvény ilyen reprezentációban adja vissza az aktuális időpontot. A dátum tömbös reprezentációja ritkábban kerül használatra, de például a clock függvény ilyen formában adja vissza az aktuális időpontot. A reprezentációban használt tömb felépítése: [év hó nap óra perc másodperc]. Konverziós függvények:

datenum dátum string sorszámra konvertálása
datestr sorszám dátum stringre konvertálása
datevec egy sorszámot vagy egy stringet konvertál vektoros ábrázolásra

Struktúra Típus

A struktúra tömb egy olyan tömb amelynek elemeire (mezőire) névvel hivatkozhatunk és eltérő típusú adatokat tárolhatunk ezekben a mezőkben. Létrehozásuk egyszerűen történik változónév megadása után ponttal elválasztva leírjuk a mezőnevet és értékadással hozzárendeljük az értéket.

pl.: patient.name = 'John Doe';
patient.billing = 127.00;
patient.test = [79 75 73; 180 178 177.5; 220 210 205];

A struktúrák mezőinek létrehozása teljesen dinamikusan történik ha szükségünk van egy új mezőre leírjuk és létrejön. Létrehozhatunk struktúrákat a struct('field1',val1,'field2',val2, ...) utasítással is. A struktúrák mezőire legegyszerűbben nevükkel hivatkozhatunk, de MATLAB-ban lehetőség van futásközben kiértékelt kifejezésekkel kiválasztani a kívánt mezőt structName. (expression) formában. Ha már nincs szükségünk valamelyik mezőre akkor azt törölhetjük is a rmfield függvénnyel pl. patient = rmfield(patient,'name');

Cella tömb

A cella tömb egy olyan tömb amelynek celláihoz különböző típusú és méretű elemeket rendelhetünk, pl. egy egészet, vagy egy mátrixot vagy éppen egy másik cella tömböt. Kezelésük hasonlóan történik a mátrixokéhoz annyi különbséggel, hogy hivatkozásoknál a kerek zárójelek, helyet a kapcsosat kell használni. Létrehozásukhoz kétféleképpen is történhet, az egyik a mátrixos jelöléssel, de az értékadás jobb oldalán álló kifejezést kapcsos zárójelek közé téve. Pl.:

A(1,1) = [1 4 3; 0 5 8; 7 2 9];
A(1,2) = 'Anne Smith';
A(2,1) = 3+7i;
A(2,2) = -pi:pi/10:pi;

Vagy létrehozhatjuk ugyan ezt a másik jelöléssel is:

A{1,1} = [1 4 3; 0 5 8; 7 2 9];
A{1,2} = 'Anne Smith';
A{2,1} = 3+7i;
A{2,2} = -pi:pi/10:pi;

Halmaz

Halmazok tömbként, karaktertömbként vagy sztringek cellatömbjeként vannak ábrázolva. Műveletek közé tartozik:

A műveletek nem követelik meg, hogy a halmaz elemei rendezettek legyenek, és egy elem többször is előfordulhat. A műveletek mindig olyan halmazt eredményeznek, mely rendezett és minden elem egyedi.

Függvény referenciák

Segítségükkel függvényeket adhatunk át paraméterként. Megadásuk: @függvénynév.

pl. r = @sin;

Felhasználói osztályok

Segítségükkel felhasználók létrehozhatják saját adattípusaikat. Bővebben erről a következő fejezetben.

Java osztályok

A MATLAB külön felületet nyújt a Java nyelvhez; lehetővé teszi a Java Api használatát, Java objektumok létrehozását Java osztályokból. A Java osztály a Matlab-ban külön adattípus. Egy Java objektumot egyszerűen az osztály konstruktorának meghívásával hozhatunk létre.

pl.: frame = java.awt.Frame('Frame A');

Ahhoz, hogy megnézzük a MATLAB-ban használt virtuális gép verziószámát, a következő parancsot kell begépelnünk:

version -java

A MATLAB-ban használhatjuk:

A .java kiterjesztésű fájlok fordítása után keletkező .class fájlok elérési útvonalát kell megadnunk a classpath.txt-ben. Ezt a fájlt a MATLAB-ban

version -java
paranccsal szerkeszthetjük. Fontos, hogy miután beírtuk a megfelelő útvonalat, indítsuk újra a MATLAB-ot, mivel az új bejegyzések csak ekkor válnak érvényessé. Az osztály definíciók automatikusan betöltődnek az első használatkor, például konstruktor híváskor. Egyetlen kivétel a which parancs használata, amely megmondja a paraméterül kapott fájl vagy függvény elérési útvonalát. A betöltött java osztályok listáját az inmem paranccsal kérhetjük le. Ha mást nem mondunk, akkor a java osztályokra teljes nevükkel hivatkozunk.
pl.: vector = java.util.Vector();
Ha el szeretnénk hagyni a csomagneveket, akkor a java-ból már ismert import parancsot kell használnunk. Paraméter nélküli hívással egy import listát kapunk, a már betöltött csomagokról.
import java.util.Vector;
Ez után már használhatjuk a
vector = Vector();
parancsot is.

Operátorok

A MATLAB logikai műveletei.

Logikai operátor Jelentés
== egyenlő
< kisebb
> nagyobb
<= kisebb, vagy egyenlő
>= nagyobb, vagy egyenlő
~= nem egyenlő
& elemenkénti logikai ÉS
&& logikai ÉS (skalárokra)
 | elemenkénti logikai VAGY
|| logikai VAGY (skalárokra)
~ elemenkénti logikai tagadás
 xor logikai kizáró VAGY

A MATLAB-nak két különböző típusú aritmetikai operátora van. A mátrix aritmetikai operátorok a lineáris algebrából ismert tulajdonságokkal, és a tömb aritmetika. Ez utóbbi nem más, mint hogy a tömb minden egyes elemén végre hajtjuk ugyanazt a műveletet, ez alkalmazható multidimenzionális tömbökre is. A pont karakter (.) különbözteti meg a tömb aritmetikai operátorokat a mátrix operátoroktól. Miután a mátrix és a tömb aritmetika az összeadás és a kivonás esetén nem különbözik egymástól ezért a .+ és a .- nem létezik.

Aritmetikai operátorok.

Mátrix Tömb Jelentés
A + B A + B összeadás
A - B A - B kivonás
A * B A .* B szorzás
A / B A ./ B osztás jobbról
A \ B A .\ B osztás balról
A ^ n A .^ n hatványozás
A' konjugált transzponálás
A.' transzponálás

Az operátorok részletes leírása.

+ összeadás, vagy unáris plusz. A-nak és B-nek vagy egyforma dimenziójúnak, vagy az egyiknek skalárnak kell lennie. Ha az egyik skalár, akkor a másik bármilyen dimenzióval rendelkezhet
- kivonás, vagy unáris mínusz. A-nak és B-nek vagy egyforma dimenziójúnak, vagy az egyiknek skalárnak kell lennie. Ha az egyik skalár, akkor a másik bármilyen dimenzióval rendelkezhet
* Mátrix szorzás. C=A*B a lineáris algebrából ismert módszerrel
.* Tömb szorzás. C=A.*B <=> C(i,j)=A(i,j)*B(i,j); dim(A) = dim(B)
/ Mátrix osztás jobbról. B/A = B*inv(A) = (A'\B')'
./ Tömb osztás jobbról. C=B./A <=> C(i,j)=B(i,j)/A(i,j); dim(A) = dim(B)
\  Mátrix osztás balról. B/A = inv(A)*B
.\ Tömb osztás balról. C=B.\A <=> C(i,j)=A(i,j)/B(i,j); dim(A) = dim(B)
^  Mátrix hatványozás. X^p a szokásos, ha p skalár. Ha p negatív egész, akkor X^p = inv(X)^(-p). Bármely más p re, X^p = V*D.^p/V, ahol [V, D] = eig(X).
 .^ Tömb hatványozás. C=A.^B <=> C(i,j)=A(i,j)^B(i,j); dim(A) = dim(B) ' Mátrix adjungált. A' = A transzponált konjugáltjával. .' Mátrix transzponált. A.' = A transzponáltjával.

Tárolás

A double és logikai típusú mátrixokat a MATLAB kétféleképpen, "teljes" és "ritka" módon is képes tárolni. Az első esetben minden elem tárolásra kerül, függetlenül attól, hogy nullától különböző vagy nulla értékről van szó. A ritka módnál viszont csak a nullától különböző elemek kerülnek eltárolásra. A kettő közötti különbség nem csak a helyigény csökkenésében, hanem a számítási sebesség növekedésében is megnyilvánul. Például egy 5000x5000-es komplex típusú mátrixban, ha csak 50000 nem nulla elem van, akkor tárolásra kerül ez az 50000 elem és ugyanennyi integer indexpár. Így a teljes eset 2%-nak megfelelő tárhelyet használtunk csak fel, továbbá egy egyszerű Ma=b lineáris egyenletrendszer megoldása is jóval gyorsabb, mintha a teljes 25 milliós mátrixal végeznénk.
Például:

S = sparse(+(rand(200,200) < 2/3));
A = full(S);
NameSizeBytesClass
A200X200320000double array
S200X200318432double array (sparse)