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) @ C memberi hasil sama dengan A @ (B @ C) — sifat asosiatif;
  • A @ B umumnya tidak sama dengan B @ A — perkalian matriks tidak komutatif.

Operator at setara dengan np.matmul #

python
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:

text
[[19 22]
 [43 50]]
True
  1. 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.
  2. Baris 8-10: np.matmul(A, B) menjalankan perhitungan yang sama, dan np.array_equal menyatakan True — kedua cara menghasilkan array bernilai persis sama.
  3. 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 #

python
import numpy as np

A = np.array([[2, 0],
              [1, 3]])
B = np.array([[4, 1],
              [2, 5]])
print(A @ B)

Output yang Dihasilkan:

text
[[ 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:

  1. Entri (0, 0): baris ke-0 dari A adalah [2, 0], kolom ke-0 dari B adalah [4, 2] → 2*4 + 0*2 = 8.
  2. Entri (0, 1): baris ke-0 dari A dengan kolom ke-1 dari B, yaitu [1, 5] → 2*1 + 0*5 = 2.
  3. Entri (1, 0): baris ke-1 dari A, yaitu [1, 3], dengan kolom ke-0 dari B → 1*4 + 3*2 = 10.
  4. Entri (1, 1): baris ke-1 dari A dengan kolom ke-1 dari B → 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 #

python
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:

text
[[5 4]
 [1 2]]
[[3 6]
 [1 4]]
False
True
  1. Baris 7-8: A @ B menghasilkan [[5 4] [1 2]], sedangkan B @ A menghasilkan [[3 6] [1 4]]. Matriks yang sama dengan urutan dibalik memberi hasil berbeda.
  2. 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.
  3. Baris 10-12: pengelompokan ulang tiga matriks — mengalikan A @ B lebih dulu lalu hasilnya dengan C, dibandingkan mengalikan A dengan B @ C lebih dulu — memberi True. 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:

SifatStatus pada @Bukti di bab ini
Komutatif (A @ B = B @ A)Tidak berlaku umumnp.array_equal menghasilkan False
Asosiatif ((A @ B) @ C = A @ (B @ C))Berlakunp.array_equal menghasilkan True
Identitas (I @ A = A)Berlakumatriks identity np.eye dari Chapter Konsep Matriks