Python Matris Çarpımı

Arkadaşlar merhaba,
Üniversitede sınav ödevi olarak 2 boyutlu matris çarpımı istediler. Bir türlü işin içinden çıkamadım.
Ödev:
“Bu ödevde, yazdiginiz Python programi kullanıcıdan iki adet, iki boyutlu matris isteyecek
ve bu matrisler uzerinde carpma islemini gerçekleştirecektir. Eger matrisler uzerinde
carpma islemi mumkun degilse program bunu belirtip sonlanmalidir. Carpma islemi
mumkun ise iki matrisi çarpıp sonucunu ekrana duzgun bir sekilde yazmalıdır.”

Örnek program akisi su sekilde olmalidir;
Birinci matrisin satir sayisini giriniz: 2
Birinci matrisin sütun sayısını giriniz: 3
Birinci matrisin değerlerini giriniz:
1
2
3
4
5
6
Birinci matris:
1 2 3
4 5 6
İkinci matrisin satir sayisini giriniz: 3
İkinci matrisin sütun sayısını giriniz: 2
İkinci matrisin değerlerini giriniz:
5
4
3
2
1
0
Ikinci matris:
5 4
3 2
1 0
Iki matrisin carpimi: (NOT: eger matris carpilamaz ise burada hata vermelidir).
14 8
41 26
Başarılar…

Tam olarak nerede takıldınız. Nasıl bir hata ile karşılaştınız. Veya algoritmasını mı kuramadınız?

1 Beğeni

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ı.

8 Beğeni

Teşekkür ederim. Kullanıcıdan da x ve y değerini çekersem projeyi tamamlamış olurum. Çok teşekkür ederim

1 Beğeni