Contents
A múlt órai első házi feladat megoldása
function kimenet=tulajd(v) kimenet=[min(v),max(v),sum(v)]; end
Teszteljük le! (Kérem hogy minden beadott megoldást teszteljetek le.)
v=1:11
v = 1 2 3 4 5 6 7 8 9 10 11
tulajd(v)
ans = 1 11 66
Kérdés: hogyan tudjuk ezt az eredményt később előhozni?
Hogy elmetjük a kimenetet:
b=ans
b = 1 11 66
Vagy úgy futtatjuk, le, hogy rötön eltároljuk a kimenetet
b=tulajd(v)
b = 1 11 66
Ismétlés
Vetorokat létrehozhatunk az ':' operátorral
v2=11:21
v2 = 11 12 13 14 15 16 17 18 19 20 21
És vektorkból csinálhatunk mátrixot ha egymás alá fűzzük őket
[v ; v2]
ans = 1 2 3 4 5 6 7 8 9 10 11 11 12 13 14 15 16 17 18 19 20 21
Vagy oszlopvektorokból is csinálhatunk, ha egymás után fűzzük őket
[v' , v2']
ans = 1 11 2 12 3 13 4 14 5 15 6 16 7 17 8 18 9 19 10 20 11 21
Beépített mátrix függvények és mátrixok indexelése
A zeros(n,m) paranccsal egy n x m-es csupa nulla mátrixot tudunk léterhozni
A=zeros(5,7)
A = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Az A(1,2) az A mátrix első soránal második elemére vonatkozik
A(1,2)=3
A = 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
A ':' operátorral a mátrix több elemére hivatkozhatunk egyszerre
A(1:2:5,2:3:7)=2
A = 0 2 0 0 2 0 0 0 0 0 0 0 0 0 0 2 0 0 2 0 0 0 0 0 0 0 0 0 0 2 0 0 2 0 0
Az a első, harmadik és ötödik sorában a másofik és ötödik elem 2-esre változott. Azért, mert a
1:2:5 2:3:7
ans = 1 3 5 ans = 2 5
vektorok ezeket a sorokat és oszlopokat jelölték ki. Az
A(:,1:3:7)=1
A = 1 2 0 1 2 0 1 1 0 0 1 0 0 1 1 2 0 1 2 0 1 1 0 0 1 0 0 1 1 2 0 1 2 0 1
paranccsal az összes sorban megváltoztatom a mátrix első negyedik és hetedik elemét.
A ones() függvényyel csupa egyesből álló mátrixot hozhatok létre
B=ones(5,7)
B = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Megkérdezhetem, hogy a két mátrix egyenlő-e, ekkor
A==B
ans = 5×7 logical array 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1 0 0 1 0 0 1
Egy logikai tömböt kapok aszerint, hogy az azonos pozíciókban lévő elemek egyenlőek-e. Ha azt szeretném tudni hol különböznek akkor az
A~=B
ans = 5×7 logical array 0 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1 0
parancsot kell futtatni. A '~' jelet logikai negálásra használja a Matlab.
Hasonlóan le lehet kérdezni a mátrix egyes részeit.
A(1:2,1:2)
ans = 1 2 1 0
Látjuk, hogy a fenti parancs az A mátix felső 2x2-es részét adta meg.
A
A = 1 2 0 1 2 0 1 1 0 0 1 0 0 1 1 2 0 1 2 0 1 1 0 0 1 0 0 1 1 2 0 1 2 0 1
De hivatkozhatok a 2x2-es alatti részre is
A(3:5,1:2)
ans = 1 2 1 0 1 2
Az eye(n) paranccsal n x n-es identités mátrixot lehet létrehozni.
eye(5)
ans = 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1
Az idenitás mátrix olyan, hogy ha azzal szorozzuk jobbról vagy balról egy M mátrixot akkor az M máttrixot kapom.
I5=eye(5)
I5 = 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1
I7=eye(7)
I7 = 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
I5*A
ans = 1 2 0 1 2 0 1 1 0 0 1 0 0 1 1 2 0 1 2 0 1 1 0 0 1 0 0 1 1 2 0 1 2 0 1
A*I7
ans = 1 2 0 1 2 0 1 1 0 0 1 0 0 1 1 2 0 1 2 0 1 1 0 0 1 0 0 1 1 2 0 1 2 0 1
Logikai indexelés
Osszuk el v2-t 3-mal
v2=v2/3
v2 = Columns 1 through 7 3.6667 4.0000 4.3333 4.6667 5.0000 5.3333 5.6667 Columns 8 through 11 6.0000 6.3333 6.6667 7.0000
Majd nézzük meg hol nagyobb v v2-nél
v>v2
ans = 1×11 logical array 0 0 0 0 0 1 1 1 1 1 1
Egy logikai vektort kapunk. Ezt a logikai szűrőként használhatjuk. Ha a vektor argumentumába írjuk akkor csak azokra az elemekre hivatkozunk ahol a logikai vektor igaz. Tehát v-nek azon elemei amelyek nagyobbak mint v2 hasonló helyen lévő elemei:
v(v>v2)
ans = 6 7 8 9 10 11
Azok az elemei amik kisebbek v2-nél.
v(v<v2)
ans = 1 2 3 4
A nulla elemei:
v(v==0)
ans = 1×0 empty double row vector
Üres vektort kaptunk.
Példa a mátrixokra
Csináljunk olyan függvényt aminek bemenete n egy pozitív egész szám, kimenete pedig egy nxn-es 'sakktábla' ami felváltva tartalmaz 0-ákat és 1-eket és a bal felső sarokban 0 van.
Először számítsuk ki egy konkrét példán, legyen n=5. Először csináljuk egy 5x5-ös csupa nulla mátrixot.
Matrix=zeros(5,5)
Matrix = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Próbáljunk elhelyezni benne jó helyre néhány 1-est
Matrix(2:2:5,2:2:5)=1
Matrix = 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0
Azt vesszük észre, hogy a megoldásunk nem jó, mert egy sorral feljebb kéne csúsztatni az 1-eseket.
Kezdjük újra
Matrix=zeros(5,5)
Matrix = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Második próbálkozás
Matrix(1:2:5,2:2:5)=1
Matrix = 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0
Ezek az 1-esek már jó helyen vannak, de még nincs mindenütt 1 ahol kéne. Azt vesszük észre, hogy ha felcsrélnénk a sorokat/oszlopokat akkor pont a hiányzó helyekre hivatkoznánk.
Matrix(2:2:5,1:2:5)=1
Matrix = 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
A mátrixunk kész. Most már csak általánosítanunk kéne az eljárást, hogy ne csak 5-re hanem bármilyen n-re működjön. Írunk egy függvényt
type('kutyus.m')
% Azt mondtátok legyen a neve kutyus function sakktabla=kutyus(n) % Módosítjuk azt a 3 parancsot amivel létrehoztuk a példánkat. % 5-helyett n-et írunk. n-et a függvény meghívásakor fogjuk megmondani. sakktabla=zeros(n,n); sakktabla(1:2:n,2:2:n)=1; sakktabla(2:2:n,1:2:n)=1; end
Teszteljük le!
kutyus(7)
ans = 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
Házi feladatok
Írjunk olyan függvényt, aminek a bemenete egy 2n x n-es mátrix. A kimenetét úgy kapjuk, hogy a mátrix első n sorából alkotott mátrixot összeszorozzuk a bemenet utolsó n sorából alkotott mátrixszal.
function kimenet=szetbont(bematrix) n=size(bematrix,2); M1=bematrix(1:n,:); M2=bematrix((n+1):2*n,:); kimenet=M1*M2; end
Írjunk olyan függvény aminek bemenete egy p eloszlásvektor (ezek elemei nem negatívak és összegük 1) kimenete pedig a szumma p(i)*log(p(i)). Nehézség, hogy a logaritmus nula elemekre nincs értelmeze. Vegyük úgy, hogy 0*log(0)=0, tehát csak a nem nulla elemkre adjuk össze a fenti az x*log(x)-et.
function kimenet=entropia(be) -be(be>0)*log(be(be>0))' end
Írjunk olyan függvényt, melynek bemenete egy olyan vektor aminek minden eleme különbözik, és kiírja a vektor összes részhalmazát.
function kimenet=reszhalmaz(be) kimenet=''; for i=0:(2^length(be)-1) maszk=logical(dec2bin(i,3)-'0'); %display(be(maszk)) kimenet=strcat(kimenet,"{",num2str(be(maszk)),"},"); end end