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