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:
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ó.
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.
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.
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 |
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');
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;
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.
Segítségükkel függvényeket adhatunk át paraméterként. Megadásuk: @függvénynév.
pl. r = @sin;
Segítségükkel felhasználók létrehozhatják saját adattípusaikat. Bővebben erről a következő fejezetben.
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:
A MATLAB-ban használhatjuk:
A java beépített osztályait.
A javahoz írt csomagokat.
Felhasználó által definiált osztályokat.
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
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. |
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:
Name | Size | Bytes | Class |
A | 200X200 | 320000 | double array |
S | 200X200 | 318432 | double array (sparse) |