-
Notifications
You must be signed in to change notification settings - Fork 0
/
qr_gsclassico.py
38 lines (32 loc) · 1.17 KB
/
qr_gsclassico.py
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
from auxiliares.matrizes import MatrizDict
from auxiliares.normas import norma2
def GSClassico(X)->list:
"""
Método de Gram-Schmidt Clássico para o cálculo da forma reduzida QR de uma matriz X.
"""
# número de linhas e de colunas
m,n = X.lins, X.cols
# instancia as matrizes
Q = MatrizDict([[0 for i in range(n)] for j in range(m)]) # Q_{m x n}
R = MatrizDict([[0 for i in range(n)] for j in range(n)]) # R_{n x n}
# percorre as colunas
for k in range(n):
# torna a coluna k de Q igual a coluna k de X
Q.setcol(k, X.col(k))
if k != 0:
# produto Q[:,k-1]'*Q[:,k]
qtq = (Q.col(k-1).T() * Q.col(k))[0,0]
for j in range(k-1):
# substitui na matriz R
R[j,k] = qtq
# nova coluna de Q
novaCol = Q.col(k) - Q.subM([0,Q.lins],[0,k-1])*R.subM([0,k-1],[k,k+1])
# altera a coluna de Q
Q.setcol(k, novaCol)
# calcula a norma
nQ_k = norma2(Q.col(k))
# substitui em R
R[k,k] = nQ_k
# substitui a coluna de Q
Q.setcol(k, Q.col(k)*(1/nQ_k))
return Q, R