function matrixOps
% diverse operatii cu vectori si matrici
% Fiecare bloc de instructiuni este precedat de
% linii de comentarii. Blocurile sunt separate de 
% linii goale.
% 
% Metode Numerice, CTI 2020-2021

% 1. definim un vector (matrice linie)
% separarea se face prin spatii
v = [5 6 7 8 9];

% 2. sau acelasi vector (tot matrice linie)
% separarea se face prin virgula
v2 = [5,6,7,8,9];

% 3. definim un vector (matrice coloana)
% In general (daca nu se specifica altfel) 
% vectorul este reprezentat de o matrice coloana. 
% Care ar fi un motiv bun pentru acest lucru?
u = [1;2;3;4;5];

% 4. Cum determinam dimensiunile unei matrici?
szu = size(u)
szv = size(v)

% 5. Dorim sa printam dimensiunile intr-un mod mai "prietenos"
% Se utilizeaza functia fprintf
fprintf('Dimensiunile lui u = (%d,%d)\n', szu);

% 6. o matrice de dimensiune (3,2) si transpusa ei
A = [1,2;3,4;5,6];
fprintf('Dimensiunile matricii A = (%d,%d)\n', size(A));

% 7. calculam matricea B inmultind matricea A cu transpusa ei
B = A*A'
% si matricea C inmultind transpusa lui A cu A
C = A'*A

% 8. calculam si afisam pe ecran, determinantii matricilor B si C
% Care dintre matricile B si C e singulara? De ce?
fprintf('Determinantul lui B := A A^T este = %4.2g\n',det(B)); 
fprintf('Determinantul lui C := A^T A este = %4.2g\n',det(C)); 

% 9. rangul unei matrici 
fprintf('Rangul lui A = %d, dim(A) = (%d,%d)\n', rank(A),size(A));
fprintf('Rangul lui B = %d, dim(B) = (%d,%d)\n', rank(B),size(B));
fprintf('Rangul lui C = %d, dim(C) = (%d,%d)\n', rank(A),size(C));

% 10. cateva matrici speciale
n = 3;
I = eye(n)
Z = zeros(n)
E = ones(n,n) % puteam spune si aici doar E = ones(n) 
F = (1/3)*E

% 11. matrici "bloc"
D = [I F; F' I]

% 12. valorile proprii. raza spectrala 
val_proprii = eig(D)

% 13. calculul urmei unei matrici si legatura cu valorile proprii
fprintf('Urma matricii D = %4.2g\n', trace(D));
fprintf('Suma valorilor proprii = %4.2g\n', sum(val_proprii));
fprintf('Determinantul lui D = %4.2g\n', det(D));
fprintf('Produsul valorilor proprii = %4.2g\n', prod(val_proprii));

% 14. vectori si valori proprii
[V, LL] = eig(D);
llambda = diag(LL);
vv  = V(:,1);
fprintf('Norma Euclidiana a lui vv = %4.2g\n', norm(vv));
ll  = llambda(1);
D*vv -ll*vv
fprintf('||D*vv-ll*vv||_2 = %4.2e\n', norm(D*vv -ll*vv));


% 15. norme operator si norma Frobenius. 
fprintf('Norma 1 a matricii D = % 4.2g\n', norm(D,1));
fprintf('Norma infinit a matricii D = %4.2g\n', norm(D,inf));
fprintf('Norma 2 a matricii D = %4.2g\n', norm(D,2));
fprintf('Norma Frobenius a matricii D = %4.2g\n', norm(D,'fro'));

     
% 16. Alte exercitii....



