%% Macierze

clear;
close all;

% MATLAB jest środowiskiem, w którym podstawową strukturą danych jest macierz; definiowanie rozmiaru macierzy nie jest wymagane.
% Przy inicjalizowaniu macierzy przecinkami lub spacją oddzielamy elementy znajdujące się w tym samym wierszu,
%  a średnikami oddzielamy kolejne wiersze.

A=[1,2,3;4,5,6;7,8,9] 

% Gdy chcemy używać symbolicznej wersji macierzy, wykorzystujemy polecenie   sym()

AS=sym(A)

%
% Do elementu znajdującego się w m-tym wierszu i k-tej kolumnie odwołujemy się za pomocą komendy A(m,k).

A(2,3)     % wyraz z wiersza nr 2 i kolumny nr 3

%
% Do wszystkich elementów znajdujących się w m-tym wierszu lub k-tej kolumnie odwołujemy się za pomocą komendy
%  A(m,:) (wiersz)   lub      A(:,k)  (kolumna).

AS(2,:)    %  wiersz nr 2
AS(:,3)    %  kolumna nr 3

%
% Możemy także odwołać się do wybranego podzbioru elementów macierzy.

AS(2:3,1:2) % podmacierz: wiersze 2-3, kolumny 1-2

%
% Przy wyborze elementów możemy korzystać z warunków logicznych.

AS(AS==5)=99  % w miejsce wyrazów równych 5 wstawiamy 99
AS(AS<5)=0    % w miejsce wyrazów mniejszych od 5 wstawiamy 0

%
% Zmienne możemy nadpisywać nie martwiąc się o ich typ i rozmiar.
% Po wykonaniu poniższej linii zmienna AS stanie sie skalarem, czyli macierzą o jednej kolumnie i jednym wierszu.

AS=AS(2,3)

%
% Wektory inicjalizujemy podobnie;
% wektor wierszowy:

a1=[1,2,3,4,5,6,7,8,9]

% wektor kolumnowy:

a2=[1;2;3;4;sym(5)]  % wystarczy do jednego wyrazu użyć sym(), a cała macierz będzie symboliczna

% Taki sam wektor wierszowy  jak a1 możemy utworzyć w następujący sposób:

a1=1:9  % wyrazy wiersza to kolejne liczby od 1 do 9
askok=1:4:10  % wyrazy tworzymy ze skokiem co 4, zaczynamy od 1, ostatni nie większy niż 10

%
% Wektory (i w ogólności - macierze) możemy transponować na pomocą znaku apostrofu:

a3=a2'

%
%% Działania na macierzach
% Czyścimy przestrzeń roboczą i tworzymy dwie pomocnicze macierze

clear

A=sym([1,2,3;4,5,6;7,8,9]) 
B=sym([2,3,4;5,6,7;8,9,10])

%
% Dodawanie:

A+B

%
% Odejmowanie:

B-A

%
% Mnożenie macierzowe (mnożenie macierzy nie jest przemienne!):

A*B
B*A

%
% Mnożenie tablicowe, tj. mnożenie odpowiadających sobie elementów macierzy

A.*B

%
% Dzielenie macierzy w środowisku MATLAB przy użyciu operatora  \ oznacza mnożenie lewostronne przez macierz odwrotną,
%  ale też oznacza rozwiązywanie układów równań liniowych (o tym przy innej okazji).

C=[1,1;1,-1]
b=[2;0]
x=C\b  % mnożenie lewostronne przez macierz odwrotną do C
y=b'/C  % mnożenie prawostronne przez macierz odwrotną do C
 %yy=b/C

%
% Dzielenie tablicowe, tj. dzielenie odpowiadających sobie elementów macierzy

A./B 

%
% Potęgowanie macierzowe odpowiadające mnożeniu macierzy przez siebie samą:

A^3

%
% Potęgowanie tablicowe, tj. potęgowanie poszczególnych wyrazów macierzy:

A.^2

%
% Wyznacznik macierzy obliczamy korzystając z funkcji det,
%  macierz odwrotną wyznaczamy za pomocą funkcji inv,
% rząd macierzy za pomocą funkcji  rank.

C=sym([3,4;1,3])
det(C)
inv(C)
rank(C)

%
% W przypadku macierzy zespolonych operator ' oznacza sprzężenie+transpozycja, a operator .' oznacza transpozycję.

Z=sym([1+1j,2-2j;3-3j,4+4j])
Z' % sprzężenie macierzy zespolonej (sprzężenie wyrazów i transpozycja macierzy)
Z.'  % tylko transpozycja macierzy
conj(Z) % sprzężenie wyrazów macierzy

%
%% Tworzenie macierzy
% Macierze możemy łączyć (konkatenacja) pamiętając o zgodności wymiarów łączonych macierzy:

clear
B=sym([1,2,3;4,5,6;7,8,9])
C=sym([1,0,1;2,0,2;3,0,3])
D=[B,C]  % dopisanie poziomo, obok macierzy B dopisana będzie z prawej strony macierz C
E=[B;C]  % dopisanie pionowo: pod macierzą B dopisana macierz C

%
% Jeżeli wymiary macierzy nie będą się zgadzać, MATLAB zwróci błąd:

%F=[D,E]

%
% Jeżeli podstawimy jakąś wartość w miejsce nieistniejącego elementu, MATLAB rozszerzy macierz i wstawi zera w pozostałe miejsca:

B(4,5)=10

%
% Jednak jeśli odwołamy się do nieistniejącego elementu, program zwróci błąd:

% B(6,7)   

%
% W środowisku MATLAB dostępnych jest wiele funkcji generujących często wykorzystywane macierze, np.
%  macierz zer:

F=zeros(5) % zerowa macierz kwadratowa 5x5
FF=zeros(2,5)  % zerowa macierz wymiaru 2x5

%
% macierz jedynek:

G=ones(3,6) % macierz wymiaru 3X6

%
% macierz jednostkowa:

H=eye(4) % macierz I_4
H1=eye(3,5)

% macierz diagonalna

D=diag(sym([1 2+j 3-i 4]))

%
% Macierze diagonalne i podobne

n=7;
wektn=[1:n] % wektor kolejnych liczb naturalnych od 1 do n
diagonal_n=diag(wektn) % macierz diagonalna z wyrazami z wektora wektn na digonali
diagonal_down=diag(wektn,-1) % liczby od 1 do n będą na linii poniżej przekątnej
diagonal_up2=diag(wektn,2) % liczby od 1 do n będą na linii 2 poziomy powyżej głównej przekątnej

%
%% Macierze losowe
%
% Macierz o wyrazach losowych z przedziału [0,1]:

I=rand(5,2)   % macierz losowa wymiaru 5 X 2

%
% Macierz o elementach będących realizacjami zmiennej losowej o rozkładzie normalnym N(0,1):

J=randn(2,4)   % macierz losowa wymiar 2 X 4

%
% Macierz o wymiarach m x k  o całkowitych wyrazach losowych z przedziału [a, b]    polecenie:   randi([a b],m,k)

K=randi([-1 1],3,4)

%
%% Wizualizacja macierzy

M_los=randi([-2 2],10);
imagesc(M_los); % funkcja tworzy obrazek, gdzie wyrazom macierzy przyporządkowane zostaną colory
% argumentem polecenia imagesc musi być macierz numeryczna
colormap("summer");
axis image
colorbar

%
% Jeszcze jeden przykład wizualizacji macierzy

M_skos=diag(wektn,-1)+diag(wektn,1)
imagesc(M_skos);
colormap("parula");
axis image
colorbar southoutside