%{
Óravázlat KöSzi II. gyakorlat.
MATLAB.

- alap adattípus a mátrix
- megadása: [] között ; a sortörés
- elemhivatkozás ()-kel elsõ koordináta sor, második oszlop.
- mûveletek: összeadás +, mátrixszorzás *, transzponálás ', determináns
számítás det() , invertálás inv() / ^-1

- scriptek, függvények
- vektorok létrehozása egyszerûsítve [start:lépésköz:end]
- vektorizált mûveletek
- vektorizált indexelés

- speciális mátrixok létrehozása: eye, diag, zeros, ones

- plotok (2D)

többsoros komment csak sorkihagyással
%}

%% Alapok

A = [1 2 3; 2 4 6; 7 8 9]; 
% egy A 3x3-as mátrix. Ha a ; lehagyjuk a sor végérõl,
%akkor az utasítás eredménye kikerül a képernyõre (DEBUGoláshoz hasznos)

elem = A(2,3); % Az A mátrix 2. sorának és 3. oszlopának eleme a 6
disp(elem); % A disp utasítással is dolgokat írhatunk a képernyõre
fprintf('Az A(2,3) eleme fprintf-fel kiíratva: %d\n',elem); % fprintf utasítás pont úgy mint C-ben.

disp('Az A mátrix kétszerese');
A+A
disp('Az A mátrix önmagával megszorozva');
disp(A*A);
fprintf('Az A mátrix determinánsa');
det(A)
fprintf('Mivel a determináns 0, ezért nincs inverz, az inverzszámítás hibát jelez.\n');
inv(A)

%% Vektorok megadása

% [start:end] a default lépésköz 1
a = [1:10];
% [start:lépésköz:end]
b = [1:2:7];
% a páros számok 2-tõl 100-ig.
c = 2:2:100;
% a vektorok hosszát a length() függvény adja meg
length(c);

%% Vezérlési szerkezetek

%írjuk ki a c elemeit szóközökkel elválasztva a képernyõre
% Figyeljük meg, hogy 1-tõl indexelünk
for i=1:length(c)
    fprintf('%d ',c(i)); 
end
fprintf('\n');

% Egy if-else szerkezet, ami megvizsgálja, hogy az A mátrix (1,1) és (1,2) eleme megegyezik-e
if A(1,1) == A(1,2)
    disp('egyforma');
else
    disp('nem egyforma');
end

%% Vektorizált mûveletek:

c = 10-b; % A b vektor minden elemét kivonom 10-bõl és kapok egy másik vektort.

%Elemenkénti mûveletek:
disp('2*b=');
disp(2.*b); % A b vektor minden elemét megszorzom 2-vel

%Elemenkénti szorzás: .*
disp('b.*b=');
disp(b.*b); % értelmezett
%DE
try
    b*b; % nem értelmezett, mert mátrixokként nem lehet a két vektort összeszorozni, hiszen nem stimmel a belsõ dimenziójuk
catch e
    disp(getReport(e));
end
%hibakezelés

%További különbségek az elemenkénti és mátrixszorzás között
B = [1,2; 3 4];
B^2; %mátrixszorzás hatványozása
B*B; %mátrixszorzás
B.*B; %elemenkénti szorzás
B.^2; %elemenkénti hatványozás

%% Elemhivatkozások:
D = [1:50];
D(2); % A vektor 2. eleme
%Hogyan tudunk hivatkozni több elemre? Mondjuk az 1. a 4. a 7. és a 9.
%elemekre?
D([1 4 7 9]); % <== lehet vektorral is indexelni
D([1:10]); % <== az elsõ 10 eleme a D-nek
D(15:20); % A D vektor 15-20-as elemeit adja vissza (elhagyható a [] zárójel)
D(35:end); % A D vektor 35-tõl kezdõdõ elemeit adja vissza a vektor utolsó eleméig

%Ugyanez mûködik mátrixszokkal is:
A = [1:4; 5:8; 9:12];

%Néhány páros elemeket leválogató utasítás:
A(:,[2 4]);
A(1:end,[2 4]);
A(1:3,[2 4]);
A([1 2 3],2:2:4);
A([1 2 3],2:2:end);
% stb.

%% Méretek

size(A); % egy vektor az A dimenzióiból itt most [3 4]
size(A,1); % az A elsõ dimenziójának (sor) mérete
size(A,2); % az A második dimenziójának (oszlop) mérete

%% Speciális mátrixok egyszerû megadása:
eye(3); % egységmátrix, csak egy paramétere van, mert az egységmátrix mindig négyzetes

zeros(5,7); % csupa 0 5*7-es mátrix

ones(3,5); % csupa 1-esekbõl álló 3x5-ös mátrix

%Végezz mûveletet az egyesekbõl álló mátrixon, hogy az csupa 0-vá alakuljon
ones(3,5)*0;
0*ones(3,5);

rand(3,7); % 0-1 közötti véletlen számokat tartalmazó 3x7-es mátrix

rand(3,7)-1; % ugyanez csak -1 és 0 között vannak a véletlen számok

rand(3,7)*5; %0 és 5 közötti véletlen számokkal

%egy 7x7-es egységmátrix
eye(7);
diag([1 1 1 1 1 1 1]);

diag([3:3:30]); % Egy diagonális mátrix az elsõ 10 3-mal osztható pozitív egész számból (3->30)

magic(10); % egy olyan 10x10-es mátrix az elsõ 10x10 = 100 számból, melyben a sorok és oszlopok összege is állandó.

%Készíts az eredmény mátrix fõátlójának elemeibõl egy vektort
diag(magic(10)); % ezen mátrix fõátlóbeli elemeibõl készít egy vektort

%% Statisztika képzõ függvények

% nekünk most vektorból szám

mean(1:3:5); % átlag
min([-2 10 5]); % minimum
max([-2 10 5]); % maximum
%stb.


%% Kirajzolás  - plot
%Alapvetõen pontokat rajzol ki, amiket sorban egymás után összeköt.
X = [1:10]; % Az X koordináták
Y = [9 1 8 2 7 3 6 4 5 0];
plot(X,Y);
plot(X,Y,'g'); %3. paraméterként megadhatunk színt pl.: green
plot(X,Y,'r*') %pirossal rajzol és *-okat rajzol nem köti össze vonalakkal

%Rajzoljuk ki a cos függvényt a -pi:pi intervallumon
x = -pi:0.01:pi;
plot(x,cos(x));
hold on; % megfogja az ábrát, hogy a következõ plot utasítás erre rajzoljon rá
plot([0 1 1 0 0],[0 0 1 1 0]); % négyzetet rajzol
hold off; %innentõl a következõ plot letörli a meglévõ ábrát

%% Egy függvény, ami eldönti hogy a bemeneti mátrixa négyzetes-e
%function negyzetesE(A)
%    if size(A,1) == size(A,2)
%        disp('Négyzetes');
%    else
%        disp('Nem négyzetes');
%    end
%end
