Dalam matematika, perkalian matriks atau produk matriks adalah operasi biner yang menghasilkan matriks dari dua matriks. Definisi ini dimotivasi oleh persamaan linear dan transformasi linear pada vektor, yang memiliki banyak aplikasi dalam matematika terapan, fisika, dan teknik. Secara lebih rinci, jika A adalah matriks n × m dan B adalah matriks m × p, produk matriks mereka AB adalah matriks n × p, di mana entri m melintasi baris A dikalikan dengan entri m ke bawah kolom B dan dijumlahkan untuk menghasilkan entri AB. Ketika dua transformasi linier diwakili oleh matriks, maka produk matriks mewakili komposisi dua transformasi.
Sumber: Wikipedia
Dengan kata lain, untuk mengalikan dua matriks, misalnya:
1 2 3 1 4
2 3 4 × 3 1 =
3 4 5 4 6
Pertama, ambil baris nomor 1 di matriks pertama, nomor kolom 1 di matriks kedua, dan kalikan 1
dengan 1
, 2
oleh 3
, dan 3
oleh 4
.
1 × 1 = 1
2 × 3 = 6
3 × 4 = 12
Sekarang tambahkan mereka bersama untuk mendapatkan item pertama Anda:
1 2 3 1 4 19
2 3 4 × 3 1 =
3 4 5 4 6
Untuk angka kedua di kolom pertama hasil, Anda harus mengambil nomor baris 2 daripada nomor baris 1 dan melakukan hal yang sama.
1 × 2 = 2
3 × 3 = 9
4 × 4 = 16
= 27
Setelah Anda melakukan seluruh kolom pertama, hasilnya terlihat seperti ini:
1 2 3 1 4 19
2 3 4 × 3 1 = 27
3 4 5 4 6 35
Sekarang, lakukan hal yang persis sama lagi, tetapi ambil kolom kedua alih-alih kolom pertama, menghasilkan:
1 2 3 1 4 19 24
2 3 4 × 3 1 = 27 35
3 4 5 4 6 35 46
Tugas Anda
Diberi dua matriks (dimensi maksimum 200x200), yang berisi angka dalam rentang -10000 hingga 10.000, di mana jumlah kolom pada yang pertama sama dengan jumlah baris pada yang kedua, kalikan yang pertama dengan yang kedua. (Perkalian matriks adalah non-komutatif.)
Anda dapat mengambil input dan memberikan output sebagai array array (atau setara), sebuah matriks (jika bahasa Anda memiliki format itu) atau string multiline.
Anda tidak boleh menggunakan bawaan untuk multiplikasi matriks.
Uji kasus
1 2 1 2 3 4 5 13 16 19 22 25
3 4 × 6 7 8 9 10 = 27 34 41 48 55
5 6 41 52 63 74 85
2 3 3 5 15 13
3 4 × 3 1 = 21 19
5 3 11 27
1 3 1 3 7 15
9 3 × 2 4 = 15 39
1 -1000 -1999 -3997
Ingat, ini adalah kode-golf , jadi kode dengan byte paling sedikit menang.
Jawaban:
Jelly ,
75 byteMembawa B dan A sebagai argumen dan mengembalikan A × B .
Cobalah online!
Bagaimana itu bekerja
sumber
æ×
, yaitu 2 byte.æ.
atom.05AB1E , 13 byte
Cobalah online!
Penjelasan
sumber
εUøεX*O
Python 2,
6966 BytesIni hanya mengikuti rumus standar, tetapi lambda-d untuk keringkasan :) Kode ungolfed sangat mudah!
Terima kasih kepada Alexi Torhamo karena telah menghemat 3 byte! :)
Kode tidak dikunci:
sumber
sum(map(int.__mul__,r,c))
untuk menyimpan 3 byte. (Tidak akan bekerja dengan floating point, tapi itu juga tidak diperlukan)J,
139 byteDisimpan 4 byte berkat mil!
Ini adalah garpu tertutup:
Yang setara dengan:
Yang melakukan perkalian yang diinginkan; ini kemudian disimpulkan.
Dengan produk titik bawaan, 5 byte:
+/ .*
Uji kasus
sumber
[:+/*"#:~
9 byteHaskell ,
57 5654 byteCobalah online!
Pemakaian:
foldr(zipWith(:))e
dengane=[]:e
adalah bentuk yang lebih pendek daritranspose
.sumber
Haskell , 45 byte
Cobalah online!
Membawa argumen dalam urutan terbalik.
sumber
R, 66 byte
Fungsi tanpa nama mengambil dua matriks R sebagai input dan mengembalikan produk. Itu memanfaatkan
apply
yang digunakan untuk menerapkan fungsi di seluruh margin array. Ini berfungsi sepertifor
loop ganda dalam kasus ini: untuk setiap kolomB
dan untuk setiap barisA
, kembalikan jumlah produk (yang di-vektor-kan).Bandingkan dengan pendekatan pure for loop (
101
bytes):sumber
outer(A,B,`*`)
tertanamapply
?Mathematica, 20 byte
Fungsi anonim. Mengambil dua daftar nomor-2 angka sebagai input, dan mengembalikan daftar nomor-2 angka sebagai output. Bagi mereka yang penasaran,
Inner
adalah fungsi yang melakukan aplikasi seperti dua-perkalian-matriks dari dua fungsi ke dua tensor.sumber
Inner[1##&,##]&
setara denganInner[1##&,##,Plus]&
...? Dan1##&~Inner~##&
akan lebih baik lagi.C #,
168167 byteTerima kasih @Mukul Kumar untuk menghemat 1 byte, loop sementara sebenarnya lebih pendek kali ini: P
Program lengkap dengan uji kasus:
sumber
for(;i<n;)
->while(i<n)
keduanya 10 byte.for (;i <n;i++)
->while (i++<n)
menghemat 1 byteMATL ,
1211 byteMatriks adalah input yang digunakan
;
sebagai pemisah baris.Cobalah online!
Perkalian matriks tanpa builtin adalah bagian dari jawaban saya untuk Showcase of languages . Namun, ketika mencoba untuk menggunakan kembali kode asli untuk jawaban ini saya menyadari itu memiliki bug (output vektor baris salah dikonversi ke vektor kolom). Ini sekarang diperbaiki, baik di sana-sini. Untuk penjelasan tentang bagaimana kode bekerja, lihat posting yang dirujuk (panjang-11 cuplikan).
sumber
C ++ 14,
173168156146 byteC.back()
bukannya mengandalkani
C.clear()
danC
harus kosong di awalSebagai lambda yang tidak disebutkan namanya:
Membutuhkan input dan output karena
vector<vector<int>>
dan output harus kosong sebelumnya.Tidak Disatukan:
Sampel:
sumber
push_back()
bukanemplace_back()
?Sekam ,
76 byteHarap perhatikan urutan argumen, coba online!
-1 byte terima kasih kepada @Zgarb!
Penjelasan
Pada dasarnya hanya melakukan apa definisi sais matrix-multiplikasi:
sumber
oΣz
bisaδṁ
JavaScript (ES6), 66 byte
sumber
C #, 131 byte
aku mencuri solusi Yodle dengan asumsi bahwa saya bisa menulis ini lebih efisien menggunakan LINQ (bukan untuk loop). Mengambil beberapa upaya tetapi agak meremehkannya.
Di sini agak rusak:
Satu-satunya 'trik' nyata di sini adalah matriks transpos
B.First().Select((f, i) => B.Select(r => r.ElementAt(i)))
,. Setelah kami memindahkan matriks kedua, kami memiliki dua arrayA[i,x]
danB[j,x]
. Ambil produk kartesius (i*j
) dan Zip masing-masingx
array panjang itu bersama-sama.Kode uji:
sumber
using System.Linq
; Saya tidak yakin apakah solusi di sini perlu menyertakan boilerplate likeusing System
danstatic void Main()
Haskell , 49 byte
Cobalah online!
Input dan output adalah daftar kolom. Memetakan setiap kolom dari matriks kedua ke baris itu, di-zip dengan kolom-kolom dari matriks pertama dan menskalakan masing-masing, dijumlahkan sebagai vektor.
Saya merasa bahwa pasti ada cara yang bagus untuk membuat pointfree ini dan menghemat beberapa byte, tetapi saya belum melihatnya.
sumber
Javascript, 128 byte
Anda mendapatkan hasilnya hanya dengan memeriksa $ - ini agak curang, tapi hei, ini menghemat beberapa byte.
sumber
PHP, 110 byte
Tiga loop untuk array elf. Ini sangat lurus ke depan ... tapi tidak banyak golf.
sumber
Sebenarnya , 14 byte
Selamat datang saran bermain golf! Cobalah online!
Tidak melakukanolf
sumber
C, 618 byte
Fungsi bernama dan sejauh ini pengajuan terpanjang di sini, sebagian karena fakta bahwa mengubah input array karakter menjadi array integer C 2-dimensi adalah yang paling banyak byte, dan juga karena saya belum bermain golf di C dalam waktu yang lama. Saya masih berusaha memperpendek ini sebanyak yang saya bisa, dan setiap tips dalam melakukannya sangat dihargai.
Sekarang, dengan keluar dari jalan, ini mengambil input melalui baris perintah dengan dua matriks diwakili oleh dua string, dengan masing-masing berisi baris yang dipisahkan oleh koma dan setiap baris diwakili oleh spasi yang dipisahkan bilangan bulat. Misalnya, matriks:
akan dimasukkan sebagai:
./a.out "1 2 3,4 5 6,7 8 9" "44 52,67 -79,83 90"
Matriks yang dihasilkan adalah output ke STDOUT sebagai string multiline. Misalnya, output untuk input di atas adalah:
sumber
Clojure, 60 byte
Banyak byte yang dihabiskan untuk mentransposisi argumen ke-2.
sumber
Ruby , 59 byte
Cobalah online!
sumber