Merhabalar,
Biliyorsunuz, matrislerle çarpma işleminde bazı kurallar var.
_x = [[2, 1], [-1, 4]] # 2 x 2'lik bir matris
_y = [[5, 0, 3], [2, 4, 3]] # 2 x 3'lük bir matris
Mesela bu yukarıdaki matrisler çarpılabilir.
Peki bunları nasıl çarparız?
[2, 1] [5, 0, 3] [2x5 + 1x2, 2x0 + 1x4, 2x3 + 1x3]
[-1, 4] [2, 4, 3] [-1x5 + 4x2, -1x0 + 4x4, -1x3 + 4x3]
Bu işlemin sonucunda 2x3
'lük bir matris oluşur.
[12, 4, 9]
[3, 16, 9]
Burada çarpma işlemini temsili olarak şöyle gösterebiliriz:
[
[x[0][0] * y[0][0] + x[0][1] * y[1][0], x[0][0] * y[0][1] + x[0][1] * y[1][1], x[0][0] * y[0][2] + x[0][1] * y[1][2]]
[x[1][0] * y[0][0] + x[1][1] * y[1][0], x[1][0] * y[0][1] + x[1][1] * y[1][1], x[1][0] * y[0][2] + x[1][1] * y[1][2]]
]
Burada dikkatinizi çekmesi gereken bir örüntü var aslında.
Önce x[0][0]
ile y[0][0]
çarpılıyor ve bu bulunan sayı, x[0][1]
ve y[1][0]
'ın çarpımıyla toplanıyor. x
bir sonraki sütuna geçtiğine, y
bir sonraki satıra geçiyor.
Yani oluşacak matrisimiz şöyle olsun diyelim:
[
[a, b, c]
[d, e, f],
]
Bu yukarıdaki abcdef
değerleri şöyle hesaplanıyor o zaman:
a = x[0][0] * y[0][0] + x[0][1] * y[1][0]
b = x[0][0] * y[0][1] + x[0][1] * y[1][1]
c = x[0][0] * y[0][2] + x[0][1] * y[1][2]
d = x[1][0] * y[0][0] + x[1][1] * y[1][0]
e = x[1][0] * y[0][1] + x[1][1] * y[1][1]
f = x[1][0] * y[0][2] + x[1][1] * y[1][2]
Buradaki satır ve sütun değişimlerinin nasıl gerçekleştiğini bulmak gerekiyor. Aşağıdaki algoritmaya bakın isterseniz.
def multiply(x, y):
if len(x[0]) != len(y):
raise ValueError(
f"Çarpım işlemi yapılamaz, çünkü 1. matrisin sütun "
f"sayısı olan {x[0]}, ikinci matrisin satır sayısı "
f"olan {len(y)} sayısına eşit değil."
)
result = []
for i in range(len(x)): # 1. matrisin satır sayısı kadar
row = [] # Listeler oluştur.
for j in range(len(y[0])): # 2. matrisin sütun sayısı kadar
value = 0 # Değeri 0 olan sayılar oluştur.
# 1. matrisin sütun sayısı değiştiğinde
# 2. matrisin satır sayısını değiştirmek için
# Aşağıdaki gibi bir for döngüsü tanımlayabiliriz.
for k in range(len(x[0])):
value += x[i][k] * y[k][j]
# x[i]'ın sütun değerlerine ulaşmak istediğimiz için
# x[i][k] ifadesini kullandık.
# y'nin satır değerlerine ulaşmak istediğimiz için
# y[k] ifadesini kullandık.
# y[k][j]'deki j ise, y[k]'nın sütunlarına ulaşmamızı
# sağlar.
row.append(value)
result.append(row)
return result
Test:
print(multiply(_x, _y))
# [[12, 4, 9], [3, 16, 9]]
Bu yukarıdaki fonksiyondan dönen değeri list comprehension
olarak kısaltabiliriz. Aşağıdaki fonksiyonun yaptığı işlem, yukarıdaki fonksiyonun yaptığı işlem ile aynıdır.
def multiply(x, y):
if len(x[0]) != len(y):
raise ValueError(
f"Çarpım işlemi yapılamaz, çünkü 1. matrisin sütun "
f"sayısı olan {x[0]}, ikinci matrisin satır sayısı "
f"olan {len(y)} sayısına eşit değil."
)
return [
[
sum(x[i][k] * y[k][j] for k in range(len(x[0])))
for j in range(len(y[0]))
]
for i in range(len(x))
]
Not: Tabi Python’da matris çarpımı yapmak için böyle bir fonksiyon kullanmak yerine numpy.dot
fonksiyonunu kullanmak daha avantajlı.