duminică, 4 decembrie 2011

operatii cu matrici

Determinarea elementului maxim al matricei

Să se determine elementul maxim al unui tabel bidimensional.

La început considerăm maxim primul element A[1,1]. Apoi parcurgând restul elementelor matricei , ori de câte ori gâsim un element A[i,j] mai mare, actualizăm maximul la valoarea acelui element.

Max:=A[1,1]
For i:=1 to n step 1 do
For j:=1 to m step 1 do
If A[i,j] >max then
Max:=A[i,j]
Endif
Endfor
Endfor

Însumarea elementelor fiecărui rând

Să se calculeze suma elementelor fiecărui rând al tabelului bidimensional. Rezultatele sâ se înscrie într-un vector.

Se va organiza un ciclu care se va repeta de n ori ( se calculează suma a n rânduri). O iteraţie a acestui ciclu va însuma cele m elemente a rândului. Însumarea elementelor rândului se va face în variabila S. La începutul prelucrării fiecărui rând S se iniţializează la valoarea 0. La sfârşitul prelucrării unui rând suma elementelor rândului ,păstrată în variabila S se va înscrie în elementul corespunzător al vectorului D[i] (i – indicele rândului).

For i:=1 to n step 1 do
S:=0
For j:=1 to m step 1 to
S:=S+A[i,j]
Endfor
D[i]:=s
Endfor

Transpunerea matricei

Să se transpună o matrice patrată.
Operaţia de transpunere se reduce la înlocuirea rândurile matricei cu coloanele ei. Se va forma o nouă matrice B, unde B[i,j]=A[j,i]

For i:=1 to n step 1 do
For j:=1 to m step 1 do
B[i,j]:=A[j,i]
Endfor
Endfor

Transpunerea se poate face în matricea iniţială. Elementele fiecărui rând situate deasupra diagonalei principale se interschimbă cu elementele coloanei corespunzătoare, situate sub diagonala principală.
For i:=1 to n –1 step 1 do
For j:=i+1 to n step 1 do
P:=A[i,j]
A[i,j]:=A[j,i]
A[j,i]:=p
Endfor
Endfor
Înmulţirea matricei cu un vector

Înmulţirea matricei A de dimensiune [n,m] la vectorul B de dimensiune [m]. Se va forma tabloul C, unde elementul C[i]=j=1ma[i,j]*b[j]

For i:=1 to n step 1 do
S:=0
For j:=1 to m step 1 do
S:=S+A[i,j]*B[j]
Endfor
C[i]:=S
Endfor


Înmulţirea a două matrici.

Pentru înmulţirea matricei A de dimensiune n*k la matricea B de dimensiune k*m se va forma matricea C, unde elementul
C[i,j]= j=1ka[i,j]*b[i,j]

For i:=1 to n step 1 do
For j:=1 to m step 1 do
S:=0
For l:=1 to k step 1 do
S:=S+A[i,l]*B[l,j]
Endfor
C[i,j]:=S
Endfor
Endfor

Eliminarea unui rând din matrice.

Se va elimina rândul k. Toate rândurile de la rândul cu numărul k+1 şi până la n vor fi deplasate cu un rând în sus.

For i:=k to n step 1 do
For j:=1 to m step 1 do
A[i,j]:=A[i+1,j]
Endfor
Endfor
N:=N-1

Inserarea unui rând în matrice.

Rândul se reprezintă cu ajutorul vectorului C.
Primele (k –1) rânduri nu se modifică. Iar celelelalte rânduri (k..n) se deplasează cu un rând în jos. Deplasarea acestor rânduri se realizează de jos în sus (ciclul după i). Apoi în rîndul k se scriu elementele vectorului C. În acest caz tabloul trebuie declarat cu (n+1) rânduri.

For i:=n to k step –1 do
For j:=1 to m step 1 do
A[i+1,j]:=A[i,j]
Endfor
Endfor
For j:=1 to m step 1 do
A[k,j]:=C[j]
Endfor
N:=N+1

Interschimbarea rândurilor matricei.

Se vor interschimba toate elementele rândului i cu elementele corespunzătoare ale rândului j.

For k:=1 to m step 1 do
P:=A[i,k]
A[i,k]:=A[j,k]
A[j,k]:=p
Endfor

Calcularea sumei elementelor diagonalei principale

Elementul e pe diagonala principală dacă i=j

S:=0
For i:=1 to n step 1 do
For j:=1 to n step 1 do
If i=j then
S:=s+A[i,j]
Endif
Endfor
Endfor

O variantă mai optimală ar fi următoarea:

S:=0
For i:=1 to n step 1 do
S:=S+A[i,i]
Endfor

Calcularea sumei elementelor diagonale secundare

Elementul e pe diagonala secundară dacă i+j=n+1

S:=0
For i:=1 to n step 1 do
For j:=1 to n step 1 do
If i+j=n+1 then
S:=S+A[i,j]
Endif
Endfor
Endfor

Sau
S:=0
For i:=1 to n step 1 do
S:=S+A[i,n+1-i]
Endfor


Probleme rezolvate cu matrice

1. Relaţii între persoane

Se dau n persoane şi matricea A, unde
A[i,j]=1, dacă persoanele i şi j se cunosc
A[i,j]=0, în caz contrar
Să se găsească persoanele care nu au nici o cunoştinţă.
Rezolvare:
Fie n – numărul persoanelor
A – matricea
K – numărul persoanelor care nu au nici o cunoştinţă
P - vector cu k componente; el reţine cele k persoane fără cunoştinţe.
Pentru rezolvarea problemei, în matricea dată se caută liniile care au numai zerouri. Ciclul For organizează prelucrarea a celor n rânduri. O iteraţie a ciclului determionă dacă rândul este format numai din zerouri. Prelucrare elementelor rândului se realizează folosind ciclul While. Ieşirea din acest ciclul se face sau când au fost examinate toate elementele rândului (j>n) sau când elementul rândului este diferit de 0 (A[i,j] #0). Dacă ieşirea din ciclu s-a realizat atunci când prima subcondiţie e falsă ((j<=n) = false) rezultă că tot rândul matrcei conţine elemente nule şi contorul k se incrementează cu o unitate.
K:=0
For i:=1 to n step 1 do
J:=1
While (j<=n) and (A[i,j]=0 do
J:=j+1
Enddo
If j>n then
K:=k+1
P[k]:=i
Endif
Endfor
If k>0 then
For i:=1 to k step 1 do
Writecard(p[i])
Endfor
Else
Writestring(‘nu există persoane fără cunoştinţe)
Endif


2. Cel mai bun dintre toţi

Într-o şcoală sunt m clase, fiecare având câte n elevi. Se cere să se determine care elev are media la învăţătură cea mai mare.


Rezolvare:

Vom memora într-o matrice toate mediile tuturor elevilor. Asctfel vom considera:

Var
Medie: array[1..m,1..n] of real

Elementul Medie[i,j] reprezintă media elevului de pe poziţia j din clasa i din şcoala respectivă.
Problema se reduce la determinarea celui mai mare element din întrega matrice. De aceea se pleacă de la ipoteza că cel mai mare element este primul – Medie[1,1]. Parcurgându-se matricea Medie, acest element maxim se poate modifica, actualizându-se la valoarea unui element găsit mai mare. Se păstrează, de fiecare dată, în variabilele i_max şi j_max poziţia pe linie, respectiv pe coloană, a elementului maxim.

Algoritm Cel_mai_bun
Var
Medie: array[1..m,1..n] of real
Clasa: cardinal
Elev: cardinal
Max: real
I_max: cardinal
J_max: cardinal
Begin
Max:=medie[1,1]
I_max:=1
J_max:=1
For clasa:=1 to m step do
For elev:=1 to n step do
If medie[clas,elev]>max then
Max:=medie[clas,elev]
I_max:=clasa
J_clasa:=elev
Endif
Endfor
Endfor

3. Generarea unei matrice dintr-un şir

Se cere să se construiască o matrice A cu m linii şi n coloane astfel încât elementele matricei să fie elementele şirului X în următoarea ordine: (cosiderăm m=3 şi n=4)
X1 X6 X7 X12
X2 X5 X8 X11
X3 X4 X9 X10
În cazul în care nu există suficiente elemente în vectorul X, deci matricea nu se poate construi, se va da un mesaj de eroare.

Rezolvare:
Var
M,n: cardinal ; dau dimensiunile matricei
K : cardinal ; numărul componentelor şirului
X : array [1..k] of real
A : array [1..m,1..n] of real

Se observă că elementele şirului sunt puse în ordine pe coloane şi anume pe o coloană de sus în jos, iar pe următoarea coloană de jos în jos. Pentru a deosebi cele două cazuri vom folosi o variabil de control notată kod care ia două valori posibile 0 şi 1. Dacă valoarea lui kod este 0 atunci pe acea coloană elementele din şir se pun începând cu prima linie şi până la linia m, iar dacă valoarea lui kod este 1 atunci pe acea coloană elementele şirului se pun începând cu linia a m-1 şi până la prima linie. Vom folosi şi variabilele :

L: cardinal ; indice în şir
Kod: 0..1 ; variabilă de control.
Algoritm
Begin
If m*n>k then
Writestring(‘Prea puţine elemente în şir’)
Else
J:=1
L:=1
Kod:=0
Repeat
If kod=0 then
Kod:=1
For i:=1 to m step 1 do
A[i,j]:=x[i]
L:=l+1
Endfor
Else
Kod:=0
For i:=m to 1 step -1 do
A[i,j]:=x[i]
L:=l+1
Endfor
Endif
Until j>n
End.

Niciun comentariu:

Trimiteți un comentariu