Vectorizare

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 )
revenire