-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGramSchmidt.m
47 lines (45 loc) · 1.48 KB
/
GramSchmidt.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
% Mirciu Andrei-Constantin 313CD
function B = GramSchmidt(A)
% Functia care calculeaza inversa matricii A folosind factorizari Gram-Schmidt
% 'Q' este o matrice ortogonala, iar 'R' este superior triunghiulara
% aflu numarul de linii si coloane ale matricei 'A'
% https://www.mathworks.com/help/matlab/ref/size.html
[m n]=size(A);
% initializez matricea 'Q' cu valorile matricii 'A'
Q = A;
% initializez matricea 'R' cu 0-uri
R = zeros(m,n);
for k = 1:n
% 'R' are pe diagonala principala norma euclidiana a vectorului coloana 'k' din 'Q'
R(k,k) = norm(Q(1:m,k));
% recalculez coloana 'k' din 'Q', impartind vechile valori la norma calculata anterior
Q(1:m,k) = Q(1:m,k) ./ R(k,k);
for j = k+1:n
% calculez restul elementelor de pe linia 'k' din 'R'
R(k,j) = Q(1:m,k)' * Q(1:m,j);
% recalculez restul coloanelor din 'Q'
Q(1:m,j) = Q(1:m,j) - Q(1:m,k) * R(k,j);
end
end
% initializez vectorul necunoscutelor 'x'
x = zeros(n,1);
% formez matricea unitate
I = eye(n);
% extrag prima coloana din 'I'
e = I(1:n,1);
% 'Q' ortogonala, deci Q^(-1) = Q'
b = Q' * e;
% rezolv primul sistem de ecuatii si obtin prima coloana din inversa matricii 'A'
x = R \ b;
% prima coloana a matricii 'B'
B = x;
for i = 2 : n
x = zeros(n,1);
e = I(1:n,i);
b = Q' * e;
% rezolv restul sistemelor de ecuatii
x = R \ b;
% adaug rezultatele la coloanele matricii B
B = [B x];
end
end