Działania na macierzach kwadratowych potrzebne są w wielu zastosowaniach (algebra, obroty). Zdarza się, że macierze mają dużą liczbę zer (macierze rzadkie). Wtedy można zastosować specjalne struktury danych, aby przyspieszyć obliczenia i zmniejszyć zapotrzebowanie na pamięć. Wg typowej definicji, macierz rzadka ma co najwyżej jeden niezerowy element w każdym wierszu i każdej kolumnie. Przykładem macierzy rzadkiej jest macierz diagonalna.
+----------------+--------+--------+ | Działanie | Dense | Sparse | +----------------+--------+--------+ | dodawanie | O(n^2) | O(n) | | odejmowanie | O(n^2) | O(n) | | transponowanie | O(n^2) | O(n) | | mnożenie | O(n^3) | O(n^2) | +----------------+--------+--------+
n = 3 # Macierz zerowa to lista list z zerami. a = [[0]*n for i in range(n)] a[1][2] = 3 # [[0, 0, 0], [0, 0, 3], [0, 0, 0]]
# Macierz zerowa to pusty słownik.
a = dict()
a[1, 2] = 3 # {(1, 2): 3}
# Dodawanie a + b = c.
c = [[0]*n for i in range(n)] # macierz zerowa
for i in range(n):
for j in range(n):
c[i][j] = a[i][j] + b[i][j]
c = dict() # macierz zerowa
for pair in a:
c[pair] = c.get(pair, 0) + a[pair]
# prościej c = dict(a)
for pair in b:
c[pair] = c.get(pair, 0) + b[pair]
# Dodawanie a - b = c.
c = [[0]*n for i in range(n)] # macierz zerowa
for i in range(n):
for j in range(n):
c[i][j] = a[i][j] - b[i][j]
c = dict() # macierz zerowa
for pair in a:
c[pair] = c.get(pair, 0) + a[pair]
# prościej c = dict(a)
for pair in b:
c[pair] = c.get(pair, 0) - b[pair]
# Otrzymujemy a_tr.
a_tr = [[0]*n for i in range(n)] # macierz zerowa
for i in range(n):
for j in range(n):
a_tr[j][i] = a[i][j]
a_tr = dict() # macierz zerowa
for (row, col) in a:
a_tr[col, row] = a[row, col]
# Mnożenie a * b = c.
c = [[0]*n for i in range(n)] # macierz zerowa
for i in range(n):
for j in range(n):
for k in range(n):
c[i][j] = c[i][j] + a[i][k] * b[k][j]
# Przygotowanie do uogólnienia.
for i in range(n):
for j in range(n):
for k in range(n):
for s in range(n):
if k == s:
c[i][j] = c[i][j] + a[i][k] * b[s][j]
c = dict() # macierz zerowa
for (row1, col1) in a:
for (row2, col2) in b:
if col1 == row2:
c[row1, col2] = c.get((row1, col2), 0) + a[row1, col1] * b[row2, col2]