b belajar.myudak

Bentuk hasil perkalian matriks

Kembalikan bentuk hasil A @ B (seperti np.matmul) dari bentuk a dan b, atau None jika tidak kompatibel. Kedua bentuk selalu punya panjang minimal 2.

[2, 3]    @ [3, 4] → [2, 4]
[5, 2, 3] @ [3, 4] → [5, 2, 4]   // batch 5, matriks yang sama dipakai untuk semuanya
[2, 3]    @ [4, 3] → None        // 3 ≠ 4

Matmul berbatch

Di transformer, attention menghitung Q @ K.T untuk setiap batch dan setiap head sekaligus: (B, H, T, d) @ (B, H, d, T) → (B, H, T, T). NumPy (dan PyTorch) memperlakukan dua dimensi terakhir sebagai matriks, dan sisanya sebagai “tumpukan” matriks yang di-broadcast.

Cara mengecek

  • Dimensi dalam: a[-1] harus sama dengan b[-2].
  • Hasil: batch + [a[-2], b[-1]], dengan batch = broadcast(a[:-2], b[:-2]).

Biasakan menulis komentar bentuk di setiap baris, misalnya # (B, T, d) @ (d, 3d) → (B, T, 3d). Kebiasaan kecil ini menghemat berjam-jam debugging.

Penjelasan

Yang diminta. Bentuk hasil A @ B untuk bentuk berdimensi ≥ 2, atau None jika tidak bisa dikalikan.

Ide kunci. @ memperlakukan dua dimensi terakhir sebagai matriks, dan semua dimensi di depannya sebagai “tumpukan” (batch). Jadi soal ini adalah dua soal kecil:

  • Bagian matriks: (n, k) @ (k, m) → (n, m). Syaratnya a[-1] == b[-2] (dimensi dalam sama).
  • Bagian batch: a[:-2] dan b[:-2] di-broadcast dengan aturan dari soal sebelumnya.

Langkah di kode:

  1. Cek dimensi dalam dulu, karena paling murah: if a[-1] != b[-2]: return None.
  2. batch = broadcast(a[:-2], b[:-2]) memakai ulang fungsi broadcasting. Untuk [5, 2, 3] @ [3, 4], batch-nya broadcast([5], []) = [5].
  3. Jika batch tidak kompatibel, None.
  4. Gabungkan: batch + [a[-2], b[-1]], yaitu baris dari A dan kolom dari B.

Yang dikembalikan: list bentuk, misalnya [4, 5, 2, 6], atau None.

Kesalahan umum: mengecek a[-1] == b[-1] (itu syarat untuk A @ B.T); lupa bahwa batch juga boleh di-broadcast ([4, 1, ...] dengan [5, ...]).

Topik
numpyshapematmul
Petunjuk 1

Dua dimensi terakhir adalah matriksnya: (n, k) @ (k, m) → (n, m). k harus sama.

Petunjuk 2

Dimensi di depannya adalah dimensi batch dan mengikuti aturan broadcasting biasa.

Python 3.14 · NumPy

Pengaturan editor

Ukuran font
Ukuran huruf di editor.
Ukuran tab
Lebar indentasi. Otomatis: 2 spasi untuk TypeScript, 4 untuk Python.
Key bindings
Ganti ke mode Vim.
Nomor baris relatif
Nomor baris dihitung dari posisi kursor (berguna untuk gerakan Vim).
Word wrap
Baris panjang dilipat agar muat di lebar editor.
IntelliSense
Saran kode otomatis saat mengetik (Ctrl+Spasi tetap bisa dipakai saat mati).

Nilai ditulis sebagai JSON. Output yang diharapkan dihitung dari solusi referensi.