%% Ritka mátrixok
%% Miért van rájuk szükség?
%
%% Az 1100x1100-as egységmátrix

A=eye(1100);
whos A

%

As=sparse(A); % konvertálás ritka mátrixszá
whos A As

%
%% Diszkrét -Laplace

As=gallery('poisson',64);
spy(As)
A=full(As); % konvertálás teli mátrixszá 
whos A As

%

b=rand(size(A,1),1); % Egyenletmegoldási sebesség összehasonlítása
tic, A\b; toc
tic, As\b; toc

%
%% Nevezetes beépített mátrixok

A=gallery('tridiag',5,-1,2,-1) % tridiagonális mátrix
full(A)

%

A=gallery('poisson',4) % diszkrét -Laplace (N_x=N_y, dx=dy)
full(A)
spy(A)

%

n=32; % pontok száma x és y irányban a [-1,1]x[-1,1] négyzeten
G=numgrid('B',n) % A belső rácspontok sorszámát megadó mátrix, 'L' az alak
spy(G)
L=delsq(G);
spy(L)
[X,Y]=meshgrid(linspace(-1,1,n),fliplr(linspace(-1,1,n)));
f=@(x,y)1+10*x.^2+0*y;
F=f(X,Y);

% Az utolsó 5 sor helyett így is csinálhatjuk a reshape parancs
% segítségével.
%
% b=reshape(F(2:31,2:31),(n-2)^2,1)%F(G>0);
% u=L\b;
% %U=G;
% U=zeros(n);
% U(2:31,2:31)=reshape(u,n-2,n-2)%(G>0)=u;
% mesh(X,Y,U)

b=F(G>0);
u=L\b;
U=G;
U(G>0)=u;
mesh(X,Y,U)

%
%% Szerkezetük

A=[1,2,0,0,0;
   0,0,4,0,1;
  -1,0,0,0,0]

% Oszloponként haladva eltároljuk a nemnulla értékeket (double)
% Minden érték mellé eltároljuk a sorindexét (double)
% Megadjuk, hogy a sorban az egyes oszlopok hányadik elemnél kezdődnek (double)
% Megadjuk a nemnulla elemek számát

As=sparse(A)
whos A As % Most több helyet foglal a ritka mátrix! :-)

%
%% Konstrukciójuk
%% sparse

A=sparse([1,3,1,2,2],[1,1,2,3,5],[1,-1,2,4,1])
full(A)

%
%% spdiags

e=[1:10]';
diag(e,3) % A diag parancs teli mátrixot csinál

spdiags([e,-3*e,5*e],[-2,0,3],6,6)
full(ans)

%
%% kron

A=gallery('tridiag',3,-1,2,-1);
kron(A,speye(3))+kron(speye(3),A)
full(ans)

%
%% Átrendezések
%% Ritka mátrixokat gyakran átrenezzük annak érdekében, hogy az LU, chol, QR felbontások a lehető legritkábbak legyenek (symrcm, symamd)

A=bucky;
spy(A)
LU=lu(A);
spy(lu(A))

%

p=symrcm(A); % Reverse Cuthill-McKee
B=A(p,p);
spy(lu(B)) % csökkent a sávszélesség az LU-felbontásban

%

p=symamd(A); % Approximate minimum degree
C=A(p,p);
spy(lu(C)) % csökkent a nemnullák száma az LU-felbontásban