Vectorizarea în PYTHON
PYTHON nu dispune expres de variabile pointer. Ca şi alte limbaje de programrea, alocările dinamice de memorie funcţionează perfect în cazul listelor simple, a seturilor, a dicţionarelor a, tuplelor. Când este vorba de construcţii mai complecate lucrurile se schimbă. Folosirea de alocări statice este jenant de restrictivă. De aceea este de preferat să se lucreze folosind o transformare cunoscută din FORTRAN sub numele de vectorizare. Dacă se dă o listă de liste, aceasta va fi transformată în listă simplă. Mai simplist vorbind, elementele unei matrice A cu M linii şi N coloane vor fi copiate într-un vector B cu M*N componente. Fără a întâmpia dificultăţi, un element A[i][j] va fi referit uşor din vectorul B[ i*N+j], cu i=0,1,2,3,...,M-1 şi j=0,1,2,3,...,M-1.
În loc să lucrăm cu matricea A, vom lucra cu vectorul B, cu condiţia de a avea o corectă punere în corespondenţă a lementelor din matricea A în vectorul B. Pentru afişare nu are nicio importanţă cum sunt reprezentate în memoria calculatorului datele, atât timp cân reuşin să punem elementele martricei linie sub line, extrăgându-le din vector element cu element. La epuizarea unei linii trecem la afişeare pe rândul următor.
Programul de la jos are funcţii care:
- vectorizează matricea,
- adună două matrice vectorizare,
- calculează produsul a două matrice vectorizte,
- afişează o matrice vectorizată.
Testarea programului s-a făcut pe cazuri simple de matrice.
Programul este:
|
#
# Vectorizarea matricei
#
def vectorizare(A, Nr_lin, Nr_col):
Nr_comp = Nr_lin * Nr_col
Vector = [ ]
for i in range(Nr_lin):
for j in range(Nr_col):
Vector.append(A[i][j])
return Vector
def aunare_vector(A,B,Nr_comp):
Vector = [ ]
for i in range(Nr_comp):
Vector.append(A[i ] + B[ i])
return Vector
def afisare_vectorizat(A, Nr_comp, Nr_col):
Lin = 1
for i in range(Nr_comp):
print(A[ i] , end=' ')
if (i == (Lin*Nr_col-1)):
print(' ')
Lin += 1
return
def produs_vectorizat(A_vect,B_vect, M, N, K):
Vect_produs = [ ]
for i in range(M):
for j in range(N):
temp = 0
for k in range(K):
temp += A_vect[i*N+k ] *B_vect[k*K+j ]
Vect_produs.append(temp)
return Vect_produs
AAA = [1,2,3,4]
B = [[0,1,0,0,3],
[2,0,0,5,0],
[0,0,4,0,0],
[0,5,0,0,7],
[1,0,8,0,0]]
C = [[ 0,-1, 0, 0,-3],
[-2, 0, 0,-5, 0],
[ 0, 0,-4, 0, 0],
[ 0,-5, 0, 0,-7],
[-1, 0,-8, 0, 0]]
B_vectorizat = vectorizare(B, 5, 5)
C_vectorizat = vectorizare(C, 5, 5)
print("Matricea B vectorizata este: ", B_vectorizat)
print("Matricea C vectorizata este: ", C_vectorizat)
nr_comp = len(B_vectorizat)
SUMA_vectorizat = aunare_vector(B_vectorizat, C_vectorizat,nr_comp)
print("Matricea SUMA vectorizata este: ", SUMA_vectorizat)
afisare_vectorizat(SUMA_vectorizat, nr_comp, 5)
|
|
Rezultatele afişate sunt:
Numarul componentelor din listă este: 10
Matricea B vectorizata este: [0, 1, 0, 0, 3, 2, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 7, 1, 0, 8, 0, 0]
Matricea C vectorizata este: [0, -1, 0, 0, -3, -2, 0, 0, -5, 0, 0, 0, -4, 0, 0, 0, -5, 0, 0, -7, -1, 0, -8, 0, 0]
Matricea SUMA vectorizata este: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
7 10
15 22
inversa matricei vectorizate va fi dată în alt program.
(Afişat azi 30 aprilie 2022 ora 17,00
Terminat azi 30 aprilie 2022 la ora 19,30 )
|