Chapter sebelumnya menunjukkan bahwa @ dan * menghasilkan angka berbeda untuk dua matriks yang sama. Bab ini memusatkan perhatian pada perkalian matriks: kita hitung satu contoh 2×2 secara manual sampai ke tiap entri, tunjukkan kesetaraan @ dengan np.matmul, lalu uji dua sifat pentingnya.
Dua hal yang akan kita buktikan dengan kode:
(A @ B) @ Cmemberi hasil sama denganA @ (B @ C)— sifat asosiatif;A @ Bumumnya tidak sama denganB @ A— perkalian matriks tidak komutatif.
Operator at setara dengan np.matmul #
import numpy as np
A = np.array([[1, 2],
[3, 4]])
B = np.array([[5, 6],
[7, 8]])
hasil_at = A @ B
hasil_matmul = np.matmul(A, B)
print(hasil_at)
print(np.array_equal(hasil_at, hasil_matmul))Output yang Dihasilkan:
[[19 22]
[43 50]]
True- Baris 7 (
hasil_at = A @ B): operator@adalah tanda perkalian matriks resmi di Python (tersedia sejak Python 3.5). Untuk array NumPy,@dipetakan ke perkalian matriks. - Baris 8-10:
np.matmul(A, B)menjalankan perhitungan yang sama, dannp.array_equalmenyatakanTrue— kedua cara menghasilkan array bernilai persis sama. - Kapan memakai bentuk fungsi: ketika operasi perlu disimpan ke variabel, diteruskan sebagai argumen ke fungsi lain, atau dipanggil lewat nama. Untuk ekspresi biasa,
@lebih ringkas.
Contoh 2×2 yang dihitung manual #
import numpy as np
A = np.array([[2, 0],
[1, 3]])
B = np.array([[4, 1],
[2, 5]])
print(A @ B)Output yang Dihasilkan:
[[ 8 2]
[10 16]]Mekanisme di balik layar: setiap entri hasil dihitung dengan satu pola yang sama, yaitu menjumlahkan A[i, k] * B[k, j] untuk semua k. Pada matriks 2×2, k hanya bernilai 0 dan 1, sehingga tiap entri adalah penjumlahan dua perkalian:
- Entri
(0, 0): baris ke-0 dariAadalah[2, 0], kolom ke-0 dariBadalah[4, 2]→2*4 + 0*2 = 8. - Entri
(0, 1): baris ke-0 dariAdengan kolom ke-1 dariB, yaitu[1, 5]→2*1 + 0*5 = 2. - Entri
(1, 0): baris ke-1 dariA, yaitu[1, 3], dengan kolom ke-0 dariB→1*4 + 3*2 = 10. - Entri
(1, 1): baris ke-1 dariAdengan kolom ke-1 dariB→1*1 + 3*5 = 16.
Empat hasil itu tersusun menjadi [[8, 2], [10, 16]], persis seperti output. Pola “baris dikali kolom” berlaku untuk ukuran berapa pun: satu entri hasil perkalian matriks 100×100 adalah penjumlahan seratus perkalian.
A@B umumnya berbeda dari B@A #
import numpy as np
A = np.array([[1, 2],
[0, 1]])
B = np.array([[3, 0],
[1, 2]])
print(A @ B)
print(B @ A)
print(np.array_equal(A @ B, B @ A))
C = np.array([[1, 1],
[2, 0]])
print(np.array_equal((A @ B) @ C, A @ (B @ C)))Output yang Dihasilkan:
[[5 4]
[1 2]]
[[3 6]
[1 4]]
False
True- Baris 7-8:
A @ Bmenghasilkan[[5 4] [1 2]], sedangkanB @ Amenghasilkan[[3 6] [1 4]]. Matriks yang sama dengan urutan dibalik memberi hasil berbeda. - Baris 9 (
np.array_equal→False): bukti numerik bahwa perkalian matriks tidak komutatif. Ini berbeda dari perkalian bilangan biasa maupun perkalian elemen*yang boleh ditukar urutannya. - Baris 10-12: pengelompokan ulang tiga matriks — mengalikan
A @ Blebih dulu lalu hasilnya denganC, dibandingkan mengalikanAdenganB @ Clebih dulu — memberiTrue. Perkalian matriks bersifat asosiatif.
Karena tidak komutatif, urutan operan menjadi bagian dari makna perhitungan: memutar vektor lalu menskalakannya tidak sama dengan menskalakan lalu memutar. Tabel berikut merangkum sifat-sifatnya:
| Sifat | Status pada @ | Bukti di bab ini |
|---|---|---|
Komutatif (A @ B = B @ A) | Tidak berlaku umum | np.array_equal menghasilkan False |
Asosiatif ((A @ B) @ C = A @ (B @ C)) | Berlaku | np.array_equal menghasilkan True |
Identitas (I @ A = A) | Berlaku | matriks identity np.eye dari Chapter Konsep Matriks |