KURZUS: Számítási módszerek

MODUL: Matematikai számítások MATLAB-bal

2. lecke Mátrixok/1

Cél: Mint már tudjuk, a MATLAB alapvetően mátrixokkal számol és dolgozik. Bármilyen konkrét problémát is kapunk, a MATLAB-bal végzett munkánk során elengedhetetlen lesz a mátrixok kezelésének megfelelő szintű ismerete. A mostani (és a következő) lecke ezt az alapot nyújtja Önnek.

Javasoljuk, hogy a helyenként talán túl technikainak (unalmasnak) tűnő részletek ellenére is nyitottan, pozitív szemlélettel forduljon ehhez az anyagrészhez. Az itt befektetett energia az alkalmazásoknál bőségesen kamatozik majd.

Követelmények: Ön akkor sajátította el megfelelően a tananyagot, ha (a MATLAB segítségével)

  • létre tud hozni mátrixokat és vektorokat elemek felsorolásával, ill. megadott egyszerű szabályok alkalmazásával;
  • fel tud tölteni vektorokat a kettőspont operátor és a linspace parancs segítségével;
  • kivágott mátrixrészekből megfelelő illesztéssel fel tud építeni új mátrixokat;
  • változóit bináris, illetve szöveges fájlba tudja menteni és szükség esetén vissza tudja tölteni;
  • el tudja végezni (méretükben megfelelő) mátrixokkal és vektorokkal az összeadás, kivonás és transzponálás műveleteket;
  • el tudja dönteni, hogy két mátrix az adott sorrendben összeszorozható-e, és ha igen, akkor el is tudja végezni a szorzást;
  • el tudja dönteni, hogy egy négyzetes mátrixnak létezik-e valódi inverze, és ha igen, akkor elő is tudja állítani az inverz mátrixot;
  • a balosztó és a jobbosztó művelet alkalmazásával meg tudja határozni két adott mátrixhoz - az előállító képlet ismeretében - a hiányzó harmadikat;
  • meg tudja határozni egy mátrix bal-, illetve jobbinverzét, amennyiben azok léteznek;
  • össze tud hasonlítani elempáronként két azonos méretű mátrixot;
  • meg tudja határozni a tanult műveletekkel felépített MATLAB kifejezések kiértékelési sorrendjét, és szükség esetén képes ezt zárójelezéssel módosítani.

Időszükséglet: A tananyag elsajátításához (a feladatok megoldásával együtt) hozzávetőlegesen 5 órára lesz szüksége.

Kulcsfogalmak

  • Mátrixok, vektorok, hivatkozások;
  • Bináris és szöveges MATLAB-adatfájlok;
  • Mátrixműveletek (összeadás, kivonás, transzponálás, szorzás, pontozott műveletek);
  • Mátrixok valódi inverze, bal- és jobbinverze, pszeudoinverze;
  • Mátrix-logikai műveletek;
  • Precedencia.
Mátrixok megadása, hivatkozások

A mátrix a MATLAB alapvető adattípusa (adathordozója), ezért a mátrixokkal végzett műveletek kiemelkedő fontosságúak lesznek a későbbi, összetettebb problémák megoldása során is.

A következőkben szisztematikusan bemutatjuk a mátrixok kezelésével kapcsolatos tudnivalókat. A lecke későbbi felhasználás esetén "referencia kézikönyvként" is szolgálhat.

Mátrixok létrehozása, betöltése

Már a MATLAB-bal való ismerkedésünk kezdeteinél is megfigyelhettük, hogy a rendszer egy kis csomagszerű ikont használ a Workspace ablakban az általunk létrehozott változók szimbólumaként. Ez jelzi azt, hogy létrejött egy mátrix objektum (függetlenül attól, hogy a felhasználó esetleg csak a pi értékét akarta megtudni, még a számológépszintű használat során - ekkor az eredmény egy 1×1-es mátrixba került).

Általánosabban persze a (kétdimenziós) mátrix a MATLAB-ban is egy olyan számtáblázat, amely n sort és m oszlopot tartalmaz. Ha a mátrixnak speciálisan csak egy oszlopa, ill. egy sora van, akkor (oszlop-, ill. sor)vektorról beszélünk.

A MATLAB-ban a mátrixok megadására a következő lehetőségek használhatók:

  • Elemek közvetlen felsorolása;
  • Kisebb mátrixokból való összerakás;
  • Beépített utasításokkal, függvényekkel, műveletekkel, kifejezésekkel történő előállítás;
  • Külső programok felhasználása;
  • Adatállományból való betöltés.

A lehetőségek többségét most áttekintjük, 3. csoport egyes opcióit a lecke későbbi részében tanuljuk, és a kisebb mátrixokból való összerakásra is visszatérünk még.

A megadás legegyszerűbb lehetősége az elemek direkt felsorolása (ez a módszer nyilvánvalóan csak kisebb mátrixokra használható), szögletes zárójelek között. Ilyenkor a sor- és oszlop szerinti tagolást/struktúrát is jeleznünk kell a MATLAB számára. A sorok végét a pontosvessző jelzi, soron belüli tagolásra a vessző használható, de ez el is hagyható (ez esetben a szóköz szeparál). A legutolsó elem után nincs pontosvessző!

>> A = [1, 2; 3, 4]
A =
    1    2
    3    4

A méretmegadásnál konzekvensnek kell lennünk: mátrixba nem illeszthető struktúra esetén hibaüzenetet ad a MATLAB.

>> B = [1 2; 3 4 5]
??? Error using ==> vertcat
CAT arguments dimensions are not consistent.

Kisebb vektorok megadásánál is az elemek felsorolása a legegyszerűbb módszer.

>> a = [1; 2; 3], b = [1 2 3 4]
a =
    1
    2
    3
b =
    1    2    3    4

Oszlopvektor megadásánál a transzponálás műveletet is használhatjuk, amely sorvektorból oszlopvektort készít és fordítva, ezzel a szeparáló pontosvesszők használata elkerülhető. (A művelet komplex elemek esetén konjugálást is végrehajt.)

>> x = [0:30:180]'  % a : operátor leírását lásd a köv. példánál
x =
    0
    30
    60
    90

MATLAB-os környezetben célszerű követnünk azt a megállapodást - példáinkban mi is ezt tesszük -, hogy a vektorokat hagyományosan kisbetűvel kezdődő változóval, a mátrixot nagybetűvel kezdődő változóval azonosítjuk. (Így áttekinthetőbb írásmódhoz jutunk.)

Hozzon létre az elemek felsorolásával egy olyan "a" oszlopvektort, amely növekedően tartalmazza az első négy prímszámot!

Hozzon létre az elemek felsorolásával egy olyan "b" sorvektort, amely növekedően tartalmazza az első négy pozitív páros számot!

Sok esetben kifejezést is használhatunk az elemek megadásához. A kettőspont operátor sorozatok előállítására alkalmas, itt az első és az utolsó elemet kell megadni (alapesetben 1-lépésközű sorozatot generál). Második paraméterként lépésköz is megadható, ha az nem 1 (természetesen az 1 lépésközt is kiírhatjuk).

>> a = [1:5], b = [10:5:30]
a =
    1    2    3    4    5
b =
    10    15    20    25    30

Hasonlóan működik a linspace operátor is. Ez esetben a sorozat első és utolsó elemét, ill. a generálandó elemek számát kell megadni. Ha ez utóbbit elhagyjuk, akkor 100 elemű sorozat jön létre. A MATLAB automatikusan egyenlő felosztást alkalmaz.

>> c = linspace(2, 10, 9)
c =
    2    3    4    5    6    7    8    9    10

Hozza létre a kettőspont operátor segítségével a következő j vektort:

j =
    1    4    7    10    13    16    19

Hozza létre a linspace parancs segítségével a következő s vektort:

s =
    0    30    60    90  120  150  180  210  240  270  300

Ha a mátrixok/vektorok megadásánál az elemek típusa különböző, akkor ez az elemek konverziójához vezet, ami túlcsordulást is eredményezhet:

>> A = [eps*1e16, pi; 2, floor(now())/2014]  % mind double
A =
    2.2204    3.1416
    2.0000  365.4161
>> B = [eps*1e16 int8(pi); 2 365.286]  % mind int8, túlcsordulás
B =
    2    3
    2  127
>> c = [90 72 45 237 114 450/2 's'];  % mind char típusú lett

Tanulságként levonható, hogy a mátrix elemeinek megadásakor lehetőleg ne keverjük az elemek típusát, mert úgyis konverzió következik be, és ez többnyire információvesztéssel jár.

Ellenőrizze a megfelelő paranccsal a fenti mátrixok, illetve vektorok típusát és helyfoglalását!

A c vektor esetén nem közöltük a rendszer válaszát. Próbálja meg először MATLAB használata nélkül előállítani az eredménymátrixot!

A létrehozott mátrixok/vektorok méretjellemzői lekérdezhetők.

>> size(A), length(A)  % a length ilyenkor a nagyobb méretet adja
ans =
    2    2
ans =  2

A MATLAB-ban üres mátrix, illetve vektor is megadható, szándékosan (pl. ciklusban, kezdőértékként), vagy akár hibás használat következményeként is.

>> C = [], size(C), d = [1:0]
C =
    []
ans =
    0    0
d =
  Empty matrix: 1-by-0

Mátrixok feltöltésére a Variable Editor is lehetőséget ad. Új mátrix létrehozásához üssünk a Workspace ablakban CTRL+N-et. Ekkor egy "unnamed" mátrixobjektum keletkezik, ami kezdetben 1×1-es és egy darab 0-s elemet tartalmaz. Erre duplán rákattintva az új mátrix egy Excel-szerű környezetben a szükséges adatokkal feltölthető. Megfigyelhető, hogy ha új sort vagy oszlopot nyitunk, akkor a MATLAB a teljes sort/oszlopot 0-val tölti fel azokon a részeken, ahol még nem adtunk meg értéket.

A feltöltés után az "unnamed" objektumot célszerű átnevezni.

Természetesen már létező mátrixot is átszerkeszthetünk (bővíthetünk) a Variable Editorral. Ez esetben a már létező névre kell duplán kattintani a Workspace ablakban.

A Variable Editor ablaka
1. ábra

Hozzon létre a Variable Editor segítségével egy 3×3-as C mátrixot, amely az első 9 pozitív egész számot tartalmazza.

Mátrixok létrehozásának következő lehetősége a darabokból való összerakás ("építkezés"). Ezt a technikát igen gyakran alkalmazzák MATLAB környezetben, bonyolultabb módokon is (a mi tananyagunkban is szerepelnek később még ilyen példák).

Az építkezéses megadásnál nagyon figyelnünk kell az összeilleszthetőségre! Elméletileg gondolkodhatunk sor- vagy oszlopstruktúrában, és a sorrend is felcserélhető. (Az eredmény az utóbbi esetben is más és más lehet, az egymás mellé rakás nem kommutatív művelet.)

>> A = [1, 2; 3, 4], B = [2.5; 4.5]
A =
    1    2
    3    4
B =
    2.5000
    4.5000
>> C = [A B]
C =
    1.0000    2.0000    2.5000
    3.0000    4.0000    4.5000
>> D = [A; B]  % hiba: nem összeilleszthető méretek
??? Error using ==> vertcat
CAT arguments dimensions are not consistent.

Hozzon létre két különböző 2×2-es mátrixot (A és B). Illessze őket össze az összes lehetséges módon (egymás mellé és egymás alá, összesen 4 lehetőség).

Már létező mátrix bővítésével is előállíthatunk új mátrixot. A bővítés történhet sor- vagy oszlopfolytonosan (merge, illetve append művelet; természetesen a megfelelő illeszkedési szabályok betartásával).

>> F = [A [10; 20]]  % merge: oszlopokkal bővítés
F =
    1    2    10
    3    4    20
>> G = [A; [10, 20]] % append: sorokkal bővítés
G =
    1    2
    3    4
    10    20

Hozzon létre egy 3×3-es mátrixot. Bővítse egy sorral, majd egy oszloppal.

Bár a mátrixok elemeinek hivatkozásaival a következő alfejezetben foglalkozunk, már itt is alkalmazzuk a részmátrix-hivatkozást, amelynek segítségével új mátrix is létrehozható (darabolás).

>> D = A(1:2, 1)  % vagy: D = A(:,1), teljes részhiv.
D =
    1
    3

Természetesen több különböző, már létező mátrix darabjaiból is építkezhetünk, ezt a lehetőséget a hivatkozásoknál tárgyaljuk.

Adatok betöltése, mentése

A külső fájlból való adatbetöltés is létrehozásnak minősül, hiszen a MATLAB-ban konkrétan a betöltéskor jön létre az új mátrixváltozó. Nagy méretű adattömbök esetében ez a lehetőség különösen nagyon praktikus.

A külső adatok tárolhatók szöveges formátumban (pl.: .txt, .dat, .csv), vagy kódolt, bináris állományban (.mat - ez az alapértelmezés). A betöltésre a load parancs szolgál, a mentésre pedig a save. A load parancsnál megadható a forrásfájl neve, és a beolvasni kívánt változók neve (akár csoportosan, joker jelekkel). Ha nem adunk meg fájlnevet, akkor a rendszer a matlab.mat fájt próbálja betölteni az aktuális könyvtárból. Ha a változónevet nem írjuk ki, akkor az összes változó betöltődik (bináris fájl esetén).

A következő példában beolvasunk egy mátrixot (lineáris egyenletrendszer mátrixa a konstans oszlopvektorral együtt), és lekérdezzük a rangját. (A lineáris egyenletrendszerek megoldását az Excel modulban már tanultuk, itt a MATLAB modulban az 5. leckében tárgyaljuk.)

>> load Ab.csv  % ha változónevet nem adunk meg, akkor Ab lesz
>> Ab
Ab =
    3    -1    5    21
    4    6    -1    20
    -3    7    4    3
>> rank(Ab)
ans =  3

A save parancs is hasonlóan működik. Alapértelmezés bináris (.mat) fájlba menti az összes változót, de kérhetünk más fájltípust is (-ASCII opció), ill. lehetőségünk van a menteni kívánt változók egyedi vagy csoportos megadására (joker jelek). Egyszerű példák:

>> save matrix.mat F         % F mátrix mentése bináris fájlba
>> save matrix.dat -ASCII G  % G mátrix mentése szöveges fájlba

A következő példában a mentésnél nem adunk meg változó, ill. fájlnevet.

>> clear, A = [4 5 6; 5, 6, 8; 1 7 7], b = [23; 30; 11], save
A =
    4    5    6
    5    6    8
    1    7    7
b =
    23
    30
    11
Saving to: matlab.mat

A rendszer tájékoztatott bennünket, hogy az alapértelmezés szerinti matlab.mat fájlba mentett (az aktuális könyvtárba). Visszatöltéssel a mentés sikere ellenőrizhető (kiírással vagy a Workspace ablakban láthatjuk a változóinkat):

>> clear, load
Loading from: matlab.mat

Mentse el az "A" betűvel kezdődő nevű MATLAB-os változóit bináris fájlba, majd törölje őket a clear paranccsal, és töltse vissza őket a mentett fájlból.

További részletek a parancsok használatáról a súgóban olvashatók.

Mátrixok/vektorok beolvasása külső programokból, így Excelből is lehetséges. A megvalósításra az xlsread parancs szolgál. A beolvasásnál megadható a táblázatrész pozíciója, és az is, hogy melyik munkalapon helyezkedik el (részletek: súgó). Példák:

>> A = xlsread('adatok.xls'% adatok a bal felső sarokban
>> A = xlsread('minta_kész1.xls', 2, 'B3:E6')
% adatok a 2. munkalap megadott helyén
>> b = xlsread('minta_kész1.xls', '2.feladat', 'G3:G6')
% adatok a 2.feladat nevű munkalap megadott helyén

Hozzon létre egy Excel munkafüzet különböző lapjain néhány mátrixot. Olvassa be a mátrixokat a MATLAB-ba az xlsread paranccsal.

Hasonlóan, az xlswrite parancs Excel munkafüzetbe való mentésre szolgál. Példa:

>> xlswrite('egyenlet.xls', [A b], 'Ab')

Itt az első paraméter a fájl neve, a második paraméter a mentendő mátrix, ami kifejezéssel is megadható, a harmadik és nem kötelező paraméter a füzetlap azonosítója. A második paraméterben megadott [A b] mátrixkifejezés az A és b mátrixok egyesítését jelenti (a korábban tanult merge művelet). Így egy 3×4-es mátrixot kaptunk és ezt mentettük el. Megjegyzendő, hogy ha a paraméterként megadott füzetlap nem létezik, akkor a MATLAB azt is létrehozza.

Próbálja ki az xlswrite parancsot többféle beállítással Excel munkafüzetbe történő adatmentésre.

Mátrixok elemhivatkozásai

Mátrixok elemeire a sor- és oszlopindex megadásával hivatkozhatunk (kerek zárójelbe írva, az elválasztásra vessző szolgál). A hivatkozás egyben értékadásra is használható.

A következő példában létrehozunk egy 3×3-as tesztmátrixot, és ezen "gyakorlatozunk". Először csak 1-1 elemet hivatkozunk, illetve módosítunk.

>> A = ones(3); % 3×3-as csupa egyes mátrix létrehozása
>> A(2, 1)  % a 2. sor 1. elemének lekérdezése
ans =  1
>> A(2, 3) = 8  % a 2. sor 3. eleme legyen 8
A =
    1    1    1
    1    1    8
    1    1    1
>> A(4, 3)  % hiba, nincs ilyen indexű elem
??? Index exceeds matrix dimensions.
>> A(4, 3) = 7  % a hivatkozás bővíti a mátrixot
A =
    1    1    1
    1    1    8
    1    1    1
    0    0    7

Látható, hogy a még nem létező indexű elemre vonatkozó értékadás nem okoz hibát, hanem bővíti a mátrixot. A MATLAB ilyen esetekben külön figyelmeztetés nélkül végrehajtja a műveletet (a nem definiált, de a bővülés miatt szükségszerűen bevezetendő új elemek 0-val töltődnek fel).

Hozzon létre egy 3×3-as tesztmátrixot, és próbálja ki az elemhivatkozást (értékadással) létező, és nem létező indexek megadásával.

Vektoroknál (egydimenziós eset) értelemszerűen egy index megadásával dolgozunk. Az indexelés 1-től indul, sor- és oszlopvektornál egyaránt.

>> b = [3:2:11];
>> b(4)
ans =  9
>> c = [2; 3; 5; 7];
>> c(2)
ans =  3

Megemlítjük, hogy a hivatkozás kétdimenziós esetben is működik egy index megadásával is. Ez esetben viszont a számozás oszlopfolytonos, erre az azonosításnál figyelnünk kell!

>> A = [1 2 3; 4 5 6; 7 8 9];
>> A(4)
ans =  2

Az értékadás (és a hivatkozás) - mátrixoknál és vektoroknál egyaránt - csoportosan is végrehajtható. Ezt a technikát is gyakran alkalmazzák a MATLAB-ban, mivel így nagy méretű objektumokat is hatékonyan lehet manipulálni.

Csoportos hivatkozásra vektoroknál célszerűen a kettőspont operátort használjuk, kerek zárójelen belül. Az alkalmazásban nincs különbség a sor- és oszlopvektorok között.

>> a = [4, 7, 2, 1, 8, 3]; a(2:4) = 0  % több elem azonos értékű lesz
a =
    4    0    0    0    8    3

Ha több elemnek különböző értéket akarunk adni, akkor a megadott elemszámoknak pontosan egyezni kell, ellenkező esetben hibát kapunk.

>> a([5, 6]) = [10, 20]
a =
    4    0    0    0    10    20

Ez a technika elemek fizikai törlésére is felhasználható, ilyenkor azonban a vektor mindig rövidül!

>> a(1:2)=[]
a =
    0    0    10    20

Mátrixoknál a csoportos hivatkozás lehetőségei a következők:

A(s_ind, :)  % teljes sor
A(: , o_ind)  % teljes oszlop
A(s_ind_1:s_ind_2, :)  % néhány sor (s_ind_1 és s_ind_2 határokkal)
A(s_ind_1:s_ind_2, o_ind_1:o_ind_2)  % részmátrix a megfelelő határokkal

Figyelje meg a hivatkozásoknál a kettőspont operátor szerepét!

Példák:

>> A = [1 2 3; 4 5 6; 7 8 9];
>> A(2, :)  % 2. sor
ans =
    4    5    6
>> A(:, 1)  % 1. oszlop
ans =
    1
    4
    7>> A(2:3, 1:2)  % részmátrix
ans =
    4    5
    7    8

Legyen B = [1:4; 5:8; 9:12; 13:16]. Adja meg a megfelelő hivatkozással

  • a 7 elemet (pozícióval és oszlopfolytonosan is);
  • B negyedik sorát;
  • B harmadik oszlopát;
  • a [6 7; 10 11] részmátrixot;
  • a [11; 15] részmátrixot.

A részmátrix-hivatkozások is felhasználhatók mátrixok összeillesztésére, azaz a korábban bemutatottakhoz hasonló típusú feladatok megoldására.

Legyen C = [1 1; 2 2] és D = [3 3; 3 3; 3 3].
Állítsa elő C és D felhasználásával az

E =
    1    1
    2    2
    3    3
    3    3

mátrixot.
Állítsa elő C és D felhasználásával az

E =
    2    2
    3    3

mátrixot.

Példa csoportos értékadásra (az A mátrix jobb felső sarokrészét nullázzuk, egy 2×2-es csupanulla mátrixszal):

>> A(1:2, [2:3]) = zeros(2)  % a [ ] kiírható, vagy elhagyható
A =
    1    0    0
    4    0    0
    7    8    9

Nullázza ki az A mátrix bal alsó sarokrészét (2×2-es részmátrix).

A csoportos értékadás a mátrix struktúrájának módosítására is felhasználható (pl. oszlopok, sorok eltolása, bővítéssel és felülírással is).

>> A = [1 2 3; 4 5 6; 7 8 9];
>> A(:, 3:5) = A(:, 1:3)  % az 1..3 sorok másolása a 3..5 sorokba
A =
    1    2    1    2    3
    4    5    4    5    6
    7    8    7    8    9

Az A mátrixon hajtsa végre azt az értékadást, hogy a 2 és 3. sorok tartalmát másolja a 3. és 4. sorokba.

A fizikai törlés műveleténél eltérés van a vektorokhoz képest: itt vigyáznunk kell arra, hogy mátrixból csak teljes sor vagy oszlop törölhető, egyéb, "hiányos" rész nem ("lyukas" mátrix nem megengedett).

>> A(1, 1)=[]  % a törlés nem végrehajtható (egy elem)
??? Subscripted assignment dimension mismatch.
>> A(1:2, 1:2)=[]  % ez sem hajtható végre (részmátrix)
??? Subscripted assignment dimension mismatch.
>> A(1, :)=[]  % teljes sor törlődik
A =
    4    5    4    5    6
    7    8    7    8    9

Komplex számokat tartalmazó mátrixok (vektorok) is ugyanígy kezelhetők, a műveletek a fentiek. Csak egy példát nézünk meg: létrehozunk egy komplex sorvektort és több lépésben bővítjük.

>> z = 5*exp(i*[0:pi/4:pi]')
% 45 fokonkénti komplex számok 0-tól pi-ig (lépésköz)
z =
  5.0000       
  3.5355 + 3.5355i
  0.0000 + 5.0000i
  -3.5355 + 3.5355i
  -5.0000 + 0.0000i
>> z =[z z*exp(i*pi)]
% merge, 180 fokkal (pi) elforgatottakkal bővítés
z =
  5.0000            -5.0000 + 0.0000i
  3.5355 + 3.5355i  -3.5355 - 3.5355i
  0.0000 + 5.0000i  -0.0000 - 5.0000i
  -3.5355 + 3.5355i  3.5355 - 3.5355i
  -5.0000 + 0.0000i  5.0000 - 0.0000i
>> z = [z; z];
% append, saját magával való bővítés

Az utolsó művelet eredményét nem közöltük. Állítsa elő önállóan a végső z-t.

Műveletek mátrixokkal
Mátrix-skalárműveletek

A mátrixokkal végzett skalárműveletek általános jellemzője, hogy a mátrix minden elemén (elemenként) végrehajtódnak. Kivételként rögtön a hatványozásra gondolhatunk, de a hatványozás valójában a mátrix önmagával végzett szorzása.

A műveletek alkalmazása egyszerű, nem tartogat meglepetést. Az összeadás és a (skalárral való) szorzás kommutatív (a kivonás és az osztás nyilvánvalóan nem).

>> A = [1, 2; 3, 4]; A + 2  % c + A = A + c
ans =
    3    4
    5    6

Állítsa elő a MATLAB-bal az A - 2 mátrixot. Hogyan értelmezhető a 2 - A mátrix? Írja le füzetébe, majd ellenőrizze a MATLAB-bal.

Az összeadást és a kivonást (skalárműveletek) úgy is tekinthetjük, hogy a MATLAB a konstansból készít egy, a megadott mátrixszal azonos méretű konstansmátrixot, és a két mátrixszal végzi el a műveletet.

>> A*0.5  % c*A = A*c
ans =
    0.5000    1.0000
    1.5000    2.0000

A skalárral való osztás a skalár reciprokával való szorzást jelenti, tehát az A/c helyett az A*1/c is írható.

Állítsa elő a MATLAB-bal az A/3 mátrixot.

Mátrix-mátrixműveletek: összeadás, kivonás, transzponálás

A mátrixok között végzett összeadásnál, ill. kivonásnál figyelnünk kell arra, hogy csak azonos méretű mátrixok/vektorok adhatók össze, vagy vonhatók ki egymásból. Méreteltérésnél hibaüzenetet kapunk.

A következő példában egy 2×3-as csupaegyes-mátrix felhasználásával mutatunk be összeadási és kivonási műveleteket.

>> A = ones(2,3); A2 = A + A, A1 = A2 - 2*A
A2 =
    2    2    2
    2    2    2
A1 =
    0    0    0
    0    0    0
>> A + A'  % a művelet nem végezhető el (2×3-as és 3×2-es)
??? Error using ==> plus
Matrix dimensions must agree.

A transzponálás műveletet már korábban is használtuk példáinkban. Ez a mátrix főátlóra való tükrözését jelenti, azaz a sorok és oszlopok felcserélődnek. (Ha a mátrixban komplex elemek is vannak, akkor azokra a rendszer konjugálást is végrehajt.)

>> B = [1, 2; 3, 4; 5, 6], B'  % 2×3-as mátrix transzponáltja 3×2-es
B =
    1    2
    3    4
    5    6
ans =
    1    3    5
    2    4    6

Vegyen fel a MATLAB-ban egy 3×2-es, komplex számokat tartalmazó mátrixot. Transzponálja (transzponálás konjugálás művelet). Ellenőrizze az eredményt!

Mátrixok szorzása

Idézze fel, hogy mit tanultunk a mátrixok összeszorozhatóságáról az Excel modulban!

Két mátrix pontosan akkor szorozható össze, ha az első oszlopainak száma a második tényező sorainak számával egyezik meg. Az eredmény egy olyan mátrix, amelynek annyi sora van, mint az első mátrixnak volt, és annyi oszlopa, amennyi a másodiknak. (A jobb áttekinthetőség céljából érdemes rajzolni!)

A méretek képletformában: [m; n] × [p; q] [m; q] és n = p (első méret: sorok száma)

Mindezt végiggondolva láthatjuk, hogy a mátrixok szorzása "nagyon nem kommutatív" művelet: előfordulhat, hogy AB végrehajtható, de BA nem; lehet az is, hogy mindkét szorzat létezik, de ABBA .

A következő példában két csupaegyes-mátrixot próbálunk összeszorozni.

>> ones(2, 3)*ones(3, 4)  % 2×3-as és 3×4-es, összeszorozható, méret 2×4 lesz
ans =
    3    3    3    3
    3    3    3    3
>> ones(3, 4)*ones(2, 3)  % 3×4-es és 2×3-as, hibaüzenet jön
??? Error using ==> mtimes
Inner matrix dimensions must agree.

Hogy a bemutatott hibát elkerüljük, a szorzás végrehajtása előtt mindig célszerű ellenőrizni (lehet fejben is), hogy a művelet elvégezhető-e, és ha igen, akkor mekkora lesz az eredménymátrix.

Az A = ones(3, 2) és a B = magic(4) mátrixokat szeretnénk A × B módon összeszorozni. Az A mátrix melyik méretét és mennyire kellene változtatni, hogy ez sikerülhessen?

Ha a MATLAB-bal szeretnénk ellenőrizni az összeszorozhatóságot, akkor a size (illetve a length) függvényt használhatjuk. Lekérdezhetjük egyszerre egy mátrix sor- és oszlopméretét, de megadható az is, hogy melyik dimenzió szerinti méretre vagyunk kíváncsiak. Például egy 3×2-es A mátrix esetén size(A, 1) = 3 és size(A, 2) = 2 lesz.

Így az A és B mátrixok összeszorozhatósága eldönthető a következő hasonlítással:

>> size(A, 2) == size(B, 1)  % belső indexek azonosak-e?

Ha ez teljesül, akkor a C = A*B mátrix mérete:

[size(A, 1) size(B, 2)]  % külső indexek

A length függvénnyel a következő módon kérdezhetők le a méretek méretek (itt D egy 7×5-ös mátrix):

>> meret=size(D), sorok=length(D(:,1)), oszlopok=length(D(1,:))
meret =
    7    5
sorok = 7
oszlopok = 5

Legyen A = [1:3; 4:6; 7:9], B = ones(3). Ellenőrizze, hogy egyenlő-e az A*B és B*A szorzat.

Hajtsa végre ugyanezt a
P = [1 1 1 1; 1 2 3 4; 1 3 6 10; 1 4 10 20] és az
IP = [4 -6 4 -1; -6 14 -11 3; 4 -11 10 -3; -1 3 -3 1] mátrixokkal is (itt IP az inverz mátrix).

Speciális mátrixokra a szorzatmátrix is lehet speciális tulajdonságú.

Idézze fel, hogy mit tanultunk a lineáris transzformációk alkalmazásáról (mátrixszorzás; bázisvektorok transzformáltjai) az Excel számítások modulban!

Következő példánkban egy véletlen mátrixot generálunk, és - az Excel számítások modulban már megismert - egyszerű transzformációs mátrixokat (swap - csere, sorokra és oszlopokra) alkalmazunk rá.

>> X = randi([1 19], 3) % véletlen mátrix generálása (határok, méret)
X =
    16    18    6
    18    13    11
    3    2    19

Legyenek a transzformációs mátrixok a következők:

SW12 = [0 1 0; 1 0 0; 0 0 1], SW13 = [0 0 1; 0 1 0; 1 0 0], SW23 =[1 0 0; 0 0 1; 0 1 0].

Az SW12*X szorzat felcseréli az X mátrix 1. és 2. sorát (a második tényező természetesen nemcsak mátrix, hanem vektor is lehet).

>> SW12 = [0 1 0; 1 0 0; 0 0 1]; SW12*X
ans =
    18    13    11
    16    18    6
    3    2    19

Ellenőrizze, hogy a többi swap mátrixszal balról történő szorzás szintén felcseréli az X mátrix megfelelő sorait!

Mi történik, ha az SW mátrixokkal jobbról szorozzuk az X mátrixot?

Négyzetes mátrixokra értelmezett a hatványozás művelete, amely technikailag a mátrix önmagával való szorzását jelenti.

>> A = [1 2 3; 4 5 6; 7 8 9];
>> A*A  % = A^2
ans =
    30    36    42
    66    81    96
  102  126  150

Magasabb kitevős hatványok is hasonló módon képezhetők.

Ellenőrizze, hogy egy adott SW mátrix páros kitevős hatványa az egységmátrixot adja, amely a helybenhagyás művelet.

Mi lesz az SW mátrixok páratlan kitevős hatványa?

Pontozott mátrixműveletek

A MATLAB az azonos méretű mátrixok (vektorok) között megengedi az elempáronkénti műveleteket. Ezek hasonlóak az Excel blokkok (tartományok) között elempáronként elvégezhető műveletekhez.

A MATLAB-ban az elempáronként végrehajtható műveletek a következők (a hagyományostól eltérő végrehajtást a műveleti operátorjel elé írt pont minősítővel jelezzük):

  • összeadás, kivonás (a végrehajtás alapértelmezés szerint elempáronkénti, nem szabad a pont jelet a + illetve a - elé írni!);
  • szorzás, osztás, hatványozás (itt kötelező az elempáronkénti műveletek előtt a pont jelet használni!);
  • transzponálás.

Mint korábban, itt is érvényes, hogyha az egyik operandus skalár, akkor a végrehajtás során valójában a másik operandusnak megfelelő méretű és csupa azonos elemből álló mátrix képződik, és ezzel dolgozik a MATLAB.

A pontozott transzponálás és a sima transzponálás között csak annyi a különbség, hogy a komplex elemek konjugálása az elsőnél nem történik meg, sima transzponáláskor viszont igen.

Néhány példa a pontozott műveletekre:

>> A = [1 2; 3 4];
>> A.^2  % elempáronkénti négyzetre emelés (nem azonos A*A-val!)
ans =
    1    4
    9    16
>> B = [3 2; 4 1];
>> C = A.*B  % elempáronkénti szorzás (a két mátrixot "egymásra fektetjük")
C =
    3    4
    12    4

Adott a C és az A = [1 5; 2 3] mátrix. Állítsa elő a B mátrixot, ha...
a) C = [2 -5; 2 -6] és C = A.*B
b) C = [0.5 -5; 2 -1.5] és C = A./B
Ellenőrizze az eredményeket!

Hajtsa végre a MATLAB-bal a következő parancsokat!

>> T = exp(i*[0:pi/3:pi]')
>> T1 = T'
>> T2 = T1.'

Értelmezze az eredményt!

A pontozott műveleteket elsősorban a függvények kiszámításánál használjuk. Ilyenkor szinte minden esetben az elempáronkénti végrehajtás szükséges, és a pontnélküli kifejezés tipikusan hibaüzenetet generálhat (illetve nem feltétlenül az történik, amit szeretnénk)!

Tegyük fel például, hogy a sin(x)*x függvényt akarjuk ábrázolni (a függvényábrázolás feladatát részletezően lásd később), és ehhez szeretnénk készíteni egy alappont-vektort és egy függvényérték-vektort.

>> x = 0:pi/4:pi
x =
        0    0.7854    1.5708    2.3562    3.1416
>> x*sin(x)  % méretprobléma, a szorzás nem végezhető el
??? Error using ==> mtimes
Inner matrix dimensions must agree.
>> x'*sin(x)  % így már elvégezhető, de nem ez kell nekünk (mátrix)
ans =
        0        0        0        0        0
        0    0.5554    0.7854    0.5554    0.0000
        0    1.1107    1.5708    1.1107    0.0000
        0    1.6661    2.3562    1.6661    0.0000
        0    2.2214    3.1416    2.2214    0.0000
>> x.*sin(x)  % erre a sorvektorra van szükségünk
ans =
        0    0.5554    1.5708    1.6661    0.0000

Próbálja ki ugyanezt a sin(x)/x és a sin(x)./x műveletekkel is!
Magyarázza meg az eredményt!

Osztási művelet mátrixokra (inverzek)

A MATLAB a mátrixszal való osztást valamilyen inverzzel való szorzással hajtja végre.

Idézze fel, hogy mit tanultunk a mátrixok inverzének létezéséről és meghatározásáról az Excel számítások modulban!

Tudjuk, hogy valódi inverz (inv parancs) akkor létezik, ha a - négyzetes - mátrix determinánsa 0, ill. ha a mátrix rangja megegyezik a sorainak (oszlopainak) számával.

Legyen E = [1 2; 3 a]. Válasszuk meg az a paraméter értékét úgy, hogy a mátrix rangja

  • 1 legyen;
  • 2 legyen!
>> E = [1 2; 3 6]  % a 2. oszlopvektor az 1. kétszerese
E =
    1    2
    3    6
>> rank(E)  % a rang 1, a mátrixnak nincs valódi inverze
ans =    1
>> det(E)  % a determináns is mutatja ugyanezt
ans =    0
>> E = [1 2; 3 4]  % a két oszlopvektor független
E =
    1    2
    3    4
>> rank(E)  % a rang 2, a mátrix invertálható
ans =    2
>> det(E)
ans =    -2  % a determináns is mutatja ugyanezt
>> inv(E)
ans =
  -2.0000    1.0000
    1.5000  -0.5000

Az inverz mátrixra teljesül, hogy A ¯ ¯ A ¯ ¯ 1 = A ¯ ¯ 1 A ¯ ¯= E ¯ ¯, ahol E ¯ ¯ az egységmátrix.

>> inv(E)*E
ans =
    1.0000        0
    0.0000    1.0000

Megjegyezzük, hogy ha mindkét mérőeszköz használható (a rang és a determináns is), akkor az előbbit célszerű alkalmazni. A determinánsszámítás ugyanis numerikus rendszerekben adhat nullához nagyon közeli kis értéket, amiről önmagában nehéz lehet eldönteni, hogy valójában nulla (csak a kerekítési pontatlanságok miatt látszik nullától különbözőnek), vagy nem nulla. A problémára még visszatérünk a lineáris egyenletek kapcsán. (Eml.: Az Excelben nem volt választásunk, ott csak a determinánsszámítást használhattuk.)

Emlékeztetünk arra (Excel számítások modul, 1. lecke), hogy mivel az inverz az adjungált mátrix elemeinek a determinánssal való osztásával áll elő, ezért - a determináns jegyeitől függően - a MATLAB-ban is kérhetünk pontos törtes megjelenítést az inverzre. Az Exceltől eltérően a valódi tört formátum itt nemcsak 3, hanem több jegyre is alkalmazott.

>> C = [-50 -81 87; -22 -38 33; 45 -18 -98]
C =
  -50  -81    87
  -22  -38    33
    45  -18  -98
>> det(C)
ans =    21673
>> format rat % törtes megjelenítés (látszik, hogy max. 5 jegy kell)
>> inv(C)
ans =
    2185/10967    -1077/2456      109/3732
    -227/7332      328/7217      -95/7799
    213/2192      -553/2637      118/21673

Egyes speciális esetekben az inverz mátrix lehet speciális alakú.

>> P = [1 1 1; 1 2 3; 1 3 6]  % Pascal-mátrix, lásd később is
P =
    1    1    1
    1    2    3
    1    3    6
>> inv(P)  % inverze csak egész számokat tartalmaz
ans =
    3.0000  -3.0000    1.0000
  -3.0000    5.0000  -2.0000
    1.0000  -2.0000    1.0000

Határozza meg a korábban tanult SW12 = [0 1 0; 1 0 0; 0 0 1] mátrix inverzét a MATLAB-bal! Magyarázza meg az eredményt!

Ha valódi inverz nem létezik (azaz: a rang meghatározása alapján látjuk), de mi ennek ellenére mégis kiadjuk az inv parancsot, akkor hiba- vagy figyelmeztető üzenetet kapunk kapunk (miszerint a mátrix szinguláris vagy közel szinguláris) és az eredmény egy hibás mátrix lesz.

>> E = [1 2; 3 6]; inv(E)
Warning: Matrix is singular to working precision.
ans =
  Inf  Inf
  Inf  Inf

A valódi inverznél általánosabban értelmezett a bal- és a jobbinverz. Ezek nem négyzetes mátrixokra is bevezethetők.

Egy A (általános) mátrix B bal-, illetve J jobbinverze definíció szerint az a nem feltétlenül négyzetes mátrix, amelyre teljesül, hogy BA=E , illetve AJ=E (itt E a megfelelő méretű négyzetes egységmátrix). A bal- és a jobbinverz létezésének az a feltétele, hogy a mátrix teljes rangú legyen (azaz a "szélső" mérete egyezzen meg a rangjával és ez legyen a megfelelő egységmátrix rangja is).

A balinverz és a jobbinverz általában nem egyértelmű (több alkalmas mátrix is választható).

Példa:

>> A = [1 2 3; 4 5 6];  % kiinduló 2×3-as mátrix
>> rank(A)  % a kisebbik méret a rang, létezik jobbinverz
ans =    2
>> jA = 1/18*[-17, 8; -2 2; 13 -4]  % jA 3×2-es jobbinverz...
jA =
  -0.9444    0.4444
  -0.1111    0.1111
    0.7222  -0.2222
>> A*jA  % ...hiszen A*jA egységmátrix
ans =
    1.0000        0
        0    1.0000
>> j2A = 1/6*[-6 3; 0 0; 4 -1]  % azonban j2A is jobbinverz...
j2A =
  -1.0000    0.5000
        0        0
    0.6667  -0.1667
>> A*j2A  % ...hiszen így is egységmátrix jön ki
ans =
    1    0
    0    1

Legyen B = [1; 2]. Válassza meg a C = [a, b] mátrixban (vektorban) az a és b együtthatókat úgy, hogy C a B mátrix balinverze legyen! Hány megfelelő C mátrix található?

A bal- és a jobbinverz előállításához célszerűen a \ (balosztó, mldivide) és a / (jobbosztó, mrdivide) műveletek használhatóak. Ezek a MATLAB-ban nagyon fontos szerephez jutnak és igen gyakran alkalmazottak.

Olvassa el a MATLAB súgóban az mldivide és az mrdivide műveletekhez tartozó szócikket!

A\B elvégezhetőségéhez szükséges, hogy A és B sorainak száma megegyezzen, A/B-nél pedig hasonlóan az kell, hogy A-nak és B-nek azonos számú oszlopa legyen.

Ellenőrizze a szorzásszabály alapján ezeket a kijelentéseket!

Az eredmény a lineáris egyenletrendszerek megoldási technikájával értelmezhető (lásd még később is). Például ha A egy n×n-es mátrix és B egy n-elemű oszlopvektor, akkor X = A\B az AX = B egyenletrendszer megoldása (eltekintve persze attól az esettől, amikor A szinguláris).

Ha csak mátrixokban gondolkodunk, akkor mondhatjuk a következőket: ha A és B is megfelelő méretű, nem feltétlenül négyzetes mátrix, akkor A\B eredménye egy olyan X mátrix, amelyre AX = B, A/B eredménye egy olyan Y mátrix, amelyre YB = A.

Egy egyszerű példa négyzetes mátrixokra:

>> A = [1 2; 3 4]; B = [5 4; 3 2];
>> C = A\B
C =
  -7.0000  -6.0000
    6.0000    5.0000
>> A*C  % valóban előáll a B mátrix
ans =
    5.0000    4.0000
    3.0000    2.0000
>> C*A  % ez viszont már nem B-t adja
ans =
  -25.0000  -38.0000
  21.0000  32.0000

Ugyanehhez az A és B mátrixhoz keressen egy olyan D mátrixot, amelyre D*B = A teljesül.

A fenti mátrixegyenleteket felhasználhatjuk bal- és jobbinverz előállítására is, ha a jobb oldalra a megfelelő méretű egységmátrixot (E; előállítása az eye paranccsal) írjuk. Eszerint egy A mátrix (egy) jobbinverze előállítható a megfelelő méretű egységmátrix felhasználásával A\E alakban, a (pontosabban: egy) balinverz pedig E/A alakban (ha léteznek).

>> A = [1 2 3; 4 5 6];
>> J = A\eye(2)  % jobbinverz konstr., a fenti j2A mátrixot kaptuk
J =
  -1.0000    0.5000
        0        0
    0.6667  -0.1667

Ugyanezzel a technikával megpróbálunk ehhez az A-hoz balinverzet is készíteni, de ez nem lesz sikeres, ugyanis balinverz nem is létezik, mert A rangja most nem a szélső méret:

>> B = eye(3)/A  % balinverz konstrukció (próba)
B =
  -0.9444    0.4444
  -0.1111    0.1111
    0.7222  -0.2222
>> B*A  % nem sikerült, B nem balinverz
ans =
    0.8333    0.3333  -0.1667
    0.3333    0.3333    0.3333
  -0.1667    0.3333    0.8333

Ellenőrizze, hogy a most kapott B valójában egy újabb jobbinverz!

Ha egy mátrixnak egyszerre létezik bal- és jobbinverze, akkor azok megegyeznek, és a mátrix ilyenkor négyzetes.

>> B = [4 2 5; 1 -1 4; 4 0 2]; rank(B)  % a mátrix invertálható
ans =    3
>> E = eye(max(size(B)))  % 3×3-as egységmátrixot készítünk
E =
    1    0    0
    0    1    0
    0    0    1
>> inv_jobb_B = B\E  % jobbinverz konstrukció
inv_jobb_B =
  -0.0500  -0.1000    0.3250
    0.3500  -0.3000  -0.2750
    0.1000    0.2000  -0.1500
>> inv_bal_B = E/B  % balinverz konstrukció, a kettő megegyezik
inv_bal_B =
  -0.0500  -0.1000    0.3250
    0.3500  -0.3000  -0.2750
    0.1000    0.2000  -0.1500
>> inv_bal_B*B  % ellenőrzés 1.
ans =
    1.0000  -0.0000  -0.0000
        0    1.0000    0.0000
        0    0.0000    1.0000
>> B*inv_jobb_B  % ellenőrzés 2.
ans =
    1.0000        0        0
    0.0000    1.0000  -0.0000
    0.0000    0.0000    1.0000
>> inv(B)  % a valódi inverz megegyezik a bal- és jobbinverzzel
ans =
  -0.0500  -0.1000    0.3250
    0.3500  -0.3000  -0.2750
    0.1000    0.2000  -0.1500

A műveletekre érvényes B/A = (A'\ B')' is (ha a megfelelő mátrixok léteznek).

>> D = A/B
D =
    2.0000  -3.0000
    3.0000  -4.0000
>> E = (B'\A')'
E =
    2.0000  -3.0000
    3.0000  -4.0000

A pszeudoinverz is egy, a valódi inverznél jóval általánosabb inverzfogalom, itt a cél a szinguláris együttható mátrixszal rendelkező lineáris egyenletrendszerek valamilyen szempontból optimális (pl. legjobban közelítő) megoldása. (Tehát eltérően a bal- és jobbinverztől, a pszeudoinverz nem teljes rangú esetekben is értelmezhető.)

Idézze fel, hogy mit tanultunk a Moore-Penrose-féle kváziinverzről - és a lineáris egyenletrendszerek megoldásáról - az Excel számítások modulban (2. lecke)!

Ahogy már tanultuk, a kváziinverz az A ¯ ¯ ' ( A ¯ ¯ A ¯ ¯ ' ) 1 vagy az ( A ¯ ¯ A ¯ ¯ ' ) 1 A ¯ ¯ képlettel számolható ki, attól függően, hogy az egyenletrendszert leíró mátrix összefüggő vagy túlhatározott. Szerencsére a MATLAB-ban a számolásra létezik beépített függvény, a pinv, a képleteket tehát nem kell megjegyeznünk.

A következő példában egy "csonkolt" lineáris egyenletrendszer mátrixon bemutatjuk, hogy a pinv függvény és a "kincstári" képlet ugyanazt az eredményt adja.

>> F = [1 2 3 4; 5 6 7 8; 9 10 11 13]  % az eredeti egyenletrendszer összefüggő
F =
    1    2    3    4
    5    6    7    8
    9    10    11    13
>> pinv(F)
ans =
  -0.1667  -1.0000    0.6667
  -0.4167    0.7500  -0.3333
  -0.6667    2.5000  -1.3333
    1.0000  -2.0000    1.0000
>> F'*inv(F*F')
ans =
  -0.1667  -1.0000    0.6667
  -0.4167    0.7500  -0.3333
  -0.6667    2.5000  -1.3333
    1.0000  -2.0000    1.0000

Ha egy négyzetes mátrix determinánsa 0, akkor bal- vagy jobbinverze sem létezik, de a pszeudoinverz itt is értelmezhető. Ha egy mátrix esetén bal- vagy jobbinverz létezik, akkor az megegyezik a pszeudoinverzzel.

>> B = [4 2 5; 1 -1 4; 4 0 2];  % a fenti B mátrix
>> pinv(B)  % pszeudoinverze ugyanaz, mint bal- és jobbinverze
ans =
  -0.0500  -0.1000    0.3250
    0.3500  -0.3000  -0.2750
    0.1000    0.2000  -0.1500

A pszeudoinverz egyszerűen ellenőrizhető két tulajdonsága a következő Hiba! A hivatkozási forrás nem található.:

  • A*pinv(A)*A = A;
  • pinv(A)*A*pinv(A) = pinv(A).

Egy nem 0 elemeket tartalmazó 2×2-es mátrixra ellenőrizze ezeket a tulajdonságokat a MATLAB-bal!

Ellenőrizze, hogy négyzetes A ¯ ¯ mátrixokra az A ¯ ¯ 1 művelet melyik inverzet számolja ki az alfejezetben megtanultak közül! Mi a helyzet nem négyzetes mátrixok esetén?

Mátrixaritmetikai és pontozott műveletek: összefoglaló

Ebben az alfejezetben két tesztmátrix felhasználásával összefoglalóan bemutatjuk a megismert aritmetikai és pontozott műveleteket. A mátrixok méreteit úgy választjuk meg, hogy a műveletek elvégezhetők legyenek.

>> A = [5 -2; 4 3]; B =[2 4; 1 -2];
Mátrixaritmetikai operátorok
MátrixJelentésEredmény
A + BÖsszeadás7     2
5     1
A - Bkivonás3    -6
3     5
A*B(mátrix)szorzás8    24
11    10
A/Bosztás jobbról
A*inv(B)
1.0000    3.0000
1.3750    1.2500
A\Bosztás balról
inv(A)*B
0.3478    0.3478
-0.1304   -1.1304
A^2hatványozás A*A17   -16
32     1
A'konjugált transzponálás5     4
-2     3

1. táblázat

Megjegyzések:

1.B értéke skalár is lehet, ilyenkor a művelet az A mátrix minden elemén végrehajtódik.
2.Ha B invertálható, akkor elméletileg A/B == A*inv(B).
3.Ha A invertálható, akkor elméletileg A\B == inv(A)*B.
4.Ha az A vagy B mátrixok inverze nem létezik, akkor az A\B illetve A/B műveletek a már tárgyalt "Warning: Matrix is singular to working precision" hibaüzenetet eredményezik.

A fenti 2. és 3. megjegyzés a számítási-kerekítési hibák miatt nem mindig teljesül:

>> A\B, inv(A)*B
ans =
    0.3478    0.3478
  -0.1304  -1.1304
ans =
    0.3478    0.3478
  -0.1304  -1.1304
>> A\B == inv(A)*B  % elempáronkénti hasonlítás (azonosak-e)
ans =
    1    0
    1    1
Pontozott operátorok
TömbJelentésEredmény
A.*Belempáronkénti szorzás10    -8
4     -6
A./Belempáronkénti osztás jobbról 2.5000   -0.5000
4.0000   -1.5000
A.\Belempáronkénti osztás balról 0.4000   -2.0000
0.2500   -0.6667
A.^B elempáronkénti hatványozás25.0000   16.0000
4.0000    0.1111
A.^2elemenkénti hatványozás25     4
16     9
2.^Aelemenkénti hatványozás32.0000    0.2500
16.0000    8.0000
A.'csak transzponálás5     4
-2    3

2. táblázat

Logikai műveletek mátrixokra

A MATLAB nagyon sokféle mátrix-logikai műveletet támogat. Ezek függvénnyel minden esetben megvalósíthatók, néhány kivételtől eltekintve operátorral is.

A következő táblázatban bemutatjuk ezeket a műveleteket, két tesztmátrixszunk: A = [5 -2; 4 3] és B = [2 4; 4 -2]; az adott művelet eredménye a táblázat utolsó oszlopában látható.

Logikai mátrixműveletek és -függvények
Logikai operátorFüggvénnyelJelentésEredmény
==eq(A,B)egyenlő0     0
1     0
<lt(A,B)kisebb0     1
0     0
>gt(A,B)nagyobb1     0
0     1
<=le(A,B)kisebb, vagy egyenlő0     1
1     0
>=ge(A,B)nagyobb, vagy egyenlő1     0
1     1
~=ne(A,B)nem egyenlő1     1
0     1
&and(A,B)elemenkénti logikai ÉS1     1
1     1
|or(A,B)elemenkénti logikai VAGY1     1
1     1
~not(A)elemenkénti logikai tagadás0     0
0     0
xor(A,B)logikai kizáró VAGY 0     0
0     0
any(A)vektorra: van-e benne nem 0?
mátrixra: oszlopokon értékeli ugyanezt, sorvektort ad
1     1
all(A)hasonlóan működik, mint az any()
értékelés művelete: mind nem 0?
1     1

3. táblázat

Figyelje meg, hogy a logikai műveletek az any és az all kivételével mindig elempárokra hajtódnak végre.

Szerezzen tapasztalatokat a fenti táblázatban megadott MATLAB-os logikai műveletek használatáról (hasonlítson össze elempáronként két azonos méretű mátrixot).

Bár már az előző leckében tanultunk a skalárokkal végezhető logikai műveletekről, a fenti táblázathoz kapcsolódóan bemutatjuk most külön ezeket is.

Logikai skalárműveletek
Logikai operátorJelentés
~numerikus érték logikai tagadása
&&logikai ÉS (skalárokra)
||logikai VAGY (skalárokra)

4. táblázat

A MATLAB - hasonlóan az Excelhez - a nem nulla értékeket logikai igaznak tekinti. Ha ilyen értéket negálunk, akkor nullát kapunk.

>> ~2014, ~0  % nem 0 tagadása 0, 0 tagadása 1
ans = 0
ans = 1

A logikai műveletek kiértékelésekor az ún. rövidzárt használja a MATLAB, azaz ha egy kifejezés eredményét az első operandus meghatározza, akkor a többi operandus már nem értékelődik ki:

>> p = [], ures = isempty(p)
p = []
ures = 1
>> ures || p < 2
ans = 1
>> p < 2 || ures
% láthatjuk, hogy a p < 2 kifejezést eddig nem vizsgálta a MATLAB
??? Operands to the || and && operators must be convertible to logical
scalar values.
A műveletek precedenciája

Most, hogy áttekintettük az összes műveletet és hasonlítást, amelyek a mátrixokra alkalmazhatók, visszatérünk a precedenciára, amelyet az első MATLAB leckében már érintettünk (eml.: Precedencia ábra), de akkor még nem rendelkeztünk minden szükséges ismerettel a teljes, kimerítő tárgyaláshoz.

A műveletek rangsora a MATLAB-ban a következő:

  • Hatványozás;
  • Előjel;
  • Szorzás, osztás: *, .*, /, ./, \;
  • Összeadás, kivonás: +, -;
  • Sorozatképzés;
  • Hasonlítások;
  • Logikai műveletek.

Ha ettől és a balról-jobbra szabály szerinti végrehajtástól el akarunk térni, akkor kellőképp zárójelezni kell! Jegyezzük meg, hogy a felesleges, de jól elhelyezett zárójelpárok a számítási eredményt nem változtatják meg.

Vizsgáljuk meg a következő példát!

>> c = 5, x = 2 + c:10, y = 2 + (c:10)
c =    5
x =
    7    8    9    10
y =
    7    8    9    10    11    12

Mivel az összeadás nagyobb precedenciájú művelet, mint a sorozatképzés, ezért az x sorozat képzése 5 + 2-ről indul és 10-ig tart. A második esetben viszont először az [5 6 7 8 9 10] sorozat készül el, majd ennek minden eleme 2-vel növelődik.

Önellenőrző kérdések
Felesleges zárójeleket és szimbólumokat ne használjon!
1. Legyen E = [2, 3, 5; 7, 11, 13]. Milyen utasítást adtunk ki (tömbrész hivatkozás; sor/oszlop), ha a következő eredményt kaptuk?

ans =
     3
    11

Felesleges zárójeleket és szimbólumokat ne használjon!
2. Legyen D = [1, 3, 5, 7; 9, 11, 13, 15; 17, 19, 21, 23]. Milyen utasítást adtunk ki (tömbrész hivatkozás), ha a következő eredményt kaptuk?

ans =
     11     13
     19     21

3. Az A, B, C, D, E mátrixokról a következőket tudjuk:

size(A) : [4 5]
size(D) : [3 5]
E = [A B; C D] és négyzetes

Milyen méretűek a B és C mátrixok?

size(B):
size(C):

4. Az A = [1 2; 3 4] mátrix felhasználásával megfelelő aritmetikai műveletek alkalmazásával és építkezéssel készítse el a következő X mátrixot:

X =
     1     2    10    20
     3     4    30    40
    -1    -2    20    40
    -3    -4    60    80

5. Legyen A = [1 2 3; 4 5 6]. Adja meg a B csupa egyes mátrixot (a ones függvénnyel) úgy, hogy A + B' elvégezhető legyen!

6. Milyen méretű mátrixot tartalmazzon a D változó, hogy az A*D művelet eredménye egy 3×7 méretű mátrix legyen?

size(A), size(B), size(C)
ans =
     3     4
ans =
     7     4
ans =
     3     3

Ha a probléma nem oldható meg, a mezőbe az NM választ gépelje be!

A D mátrix egy lehetséges mérete sor×oszlop alakban:

7. Legyen A = [1, 2; 3, 4] és B = [10, 7; 22, 15]. Határozza meg azt a Z mátrixot, amelyre Z*B = A. Adja meg az Z mátrix 1. sorának 1. elemét!

Ha az eredmény nem egész, két tizedesre kerekítve írja be!

Eredmény:

8. Ellenőrizze, hogy az M = [1 1 1; 1 1 2] mátrix jobbinverze az N1 = [1 -2; 1 1; -1 1] mátrix! Mutassa meg, hogy N2 = [1 -0.5; 1 -0.5; -1 1] is jobbinverz! Keressen még egy jobbinverzet is!

A tankönyv használata nélkül, csak a MATLAB súgó (mldivide, mrdivide) segítségével írja fel (mátrixegyenlettel), hogy mi lesz a következő kifejezések értéke:

A\B, illetve

E/A,

ahol E az egységmátrix! (Feltehetjük, hogy a műveletek elvégezhetők.)

9. Legyen X = [8 5 2 2; 6 4 1 4; 3 0 1 0].

Nem négyzetes mátrixnak nincs inverze, csak pszeudoinverze. Ellenőrizze, hogy olyan esetben, mint most (az X mátrixnak kevesebb sora van, mint oszlopa) a pszeudoinverz a jobbinverz, azaz X*pinv(X) lesz az egységmátrix. A pszeudoinverz tehát most X\eye(3) módon - ahol eye(3) a 3×3-as egységmátrix - is számolható.

Határozza meg az X transzponáltjának a pszeudoinverzét is! Ez balinverz?