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