In der Mathematik ist die Matrixmultiplikation oder das Matrixprodukt eine binäre Operation, die eine Matrix aus zwei Matrizen erzeugt. Die Definition wird durch lineare Gleichungen und lineare Transformationen auf Vektoren motiviert, die zahlreiche Anwendungen in der angewandten Mathematik, Physik und Technik haben. Genauer gesagt, wenn A eine n × m-Matrix und B eine m × p-Matrix ist, ist ihr Matrixprodukt AB eine n × p-Matrix, in der die m Einträge über eine Reihe von A mit den m Einträgen nach a multipliziert werden Spalten von B und summiert, um einen Eintrag von AB zu erzeugen. Wenn zwei lineare Transformationen durch Matrizen dargestellt werden, repräsentiert das Matrixprodukt die Zusammensetzung der beiden Transformationen.
Quelle: Wikipedia
Mit anderen Worten, um zwei Matrizen zu multiplizieren, zum Beispiel:
1 2 3 1 4
2 3 4 × 3 1 =
3 4 5 4 6
Nehmen Sie zuerst die Zeilennummer 1 in der ersten Matrix, die Spaltennummer 1 in der zweiten Matrix und multiplizieren Sie 1
mit 1
, 2
mit 3
und 3
mit 4
.
1 × 1 = 1
2 × 3 = 6
3 × 4 = 12
Addiere sie nun zu deinem ersten Gegenstand:
1 2 3 1 4 19
2 3 4 × 3 1 =
3 4 5 4 6
Für die zweite Zahl in der ersten Spalte des Ergebnisses müssen Sie anstelle der Zeilennummer 1 die Zeilennummer 2 verwenden und dasselbe tun.
1 × 2 = 2
3 × 3 = 9
4 × 4 = 16
= 27
Nachdem Sie die gesamte erste Spalte erstellt haben, sieht das Ergebnis folgendermaßen aus:
1 2 3 1 4 19
2 3 4 × 3 1 = 27
3 4 5 4 6 35
Machen Sie jetzt genau dasselbe noch einmal, aber nehmen Sie die zweite Spalte anstelle der ersten, was zur Folge hat:
1 2 3 1 4 19 24
2 3 4 × 3 1 = 27 35
3 4 5 4 6 35 46
Deine Aufgabe
Wenn zwei Matrizen (maximale Abmessungen 200 x 200) mit Zahlen im Bereich von -10000 bis 10000 gegeben sind, wobei die Anzahl der Spalten in der ersten der Anzahl der Zeilen in der zweiten entspricht, multiplizieren Sie die erste mit der zweiten. (Matrixmultiplikation ist nicht kommutativ.)
Sie können Eingaben und Ausgaben als Array von Arrays (oder Äquivalente), als Matrix (wenn Ihre Sprache dieses Format hat) oder als mehrzeilige Zeichenfolge angeben.
Sie dürfen keine eingebauten Funktionen für die Matrixmultiplikation verwenden.
Testfälle
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
Denken Sie daran, das ist Code-Golf , also gewinnt der Code mit den wenigsten Bytes.
Antworten:
Gelee ,
75 BytesNimmt B und A als Argumente und gibt A × B zurück .
Probieren Sie es online!
Wie es funktioniert
quelle
æ×
, das sind 2 Bytes.æ.
Atom verwendete.05AB1E , 13 Bytes
Probieren Sie es online!
Erläuterung
quelle
εUøεX*O
Python 2,
6966 BytesDies folgt nur der Standardformel, aber Lambda-D für die Prägnanz :) Der Code ohne Golf ist extrem einfach!
Vielen Dank an Alexi Torhamo für das Speichern von 3 Bytes! :)
Ungolfed-Code:
quelle
sum(map(int.__mul__,r,c))
3 Bytes speichern. (Funktioniert nicht mit Gleitkommazahlen, war aber auch nicht erforderlich)J,
139 BytesDank Meilen 4 Bytes gespart!
Dies ist eine Gabel mit Kappe:
Welches ist gleichbedeutend mit:
Welches führt die gewünschte Multiplikation; diese werden dann aufsummiert.
Bei eingebautem Skalarprodukt 5 Bytes:
+/ .*
Testfälle
quelle
[:+/*"#:~
9 Bytes gestoßenHaskell ,
57 5654 BytesProbieren Sie es online!
Verwendung:
foldr(zipWith(:))e
mite=[]:e
ist eine kürzere Form vontranspose
.quelle
Haskell , 45 Bytes
Probieren Sie es online!
Argumentiert in umgekehrter Reihenfolge.
quelle
R, 66 Bytes
Unbenannte Funktion, die zwei R-Matrizen als Eingabe verwendet und das Produkt zurückgibt. Es
apply
wird verwendet, um Funktionen über Array-Ränder hinweg anzuwenden.for
In diesem Fall funktioniert es wie eine Doppelschleife: Geben Sie für jede SpalteB
und für jede Zeile vonA
die Summe der (vektorisierten) Produkte zurück.Vergleichen Sie mit dem reinen for-Loop-Ansatz (
101
Bytes):quelle
outer(A,B,`*`)
eher so etwas tun als die eingebettetenapply
Anrufe?Mathematica, 20 Bytes
Anonyme Funktion. Nimmt zwei Rang-2-Listen von Zahlen als Eingabe und gibt eine Rang-2-Liste von Zahlen als Ausgabe zurück. Für die Neugierigen
Inner
ist eine Funktion, die eine matrixmultiplikationsartige Anwendung von zwei Funktionen auf zwei Tensoren ausführt.quelle
Inner[1##&,##]&
ist gleichbedeutend mitInner[1##&,##,Plus]&
...? Und so1##&~Inner~##&
wäre es noch besser.C #,
168167 BytesVielen Dank an @Mukul Kumar für das Speichern von 1 Byte, die while-Schleife war dieses Mal tatsächlich kürzer: P
Volles Programm mit Testfällen:
quelle
for(;i<n;)
->while(i<n)
sind beide 10 Bytes.for (;i <n;i++)
->while (i++<n)
1 Byte speichernMATL ,
1211 BytesMatrizen werden
;
als Zeilentrennzeichen eingegeben .Probieren Sie es online!
Die Matrixmultiplikation ohne eingebauten Code war Teil meiner Antwort auf Showcase of languages . Als ich jedoch versuchte, den ursprünglichen Code für diese Antwort wiederzuverwenden, stellte ich fest, dass er einen Fehler aufwies (die Zeilenvektorausgabe wurde falsch in einen Spaltenvektor konvertiert). Dies ist jetzt korrigiert, hier und da. Eine Erklärung der Funktionsweise des Codes finden Sie im entsprechenden Beitrag (Länge-11-Snippet).
quelle
C ++ 14,
173168156146 BytesC.back()
stattdessen aufi
C.clear()
und BenötigenC
, beim Start leer zu seinAls unbenanntes Lambda:
Benötigt Ein- und Ausgabe als
vector<vector<int>>
und Ausgabe muss vorher leer sein.Ungolfed:
Stichprobe:
quelle
push_back()
statt verwendenemplace_back()
?Schale ,
76 BytesBitte beachten Sie die Argumentationsreihenfolge, versuchen Sie es online!
-1 Byte dank @Zgarb!
Erläuterung
Grundsätzlich tun, was die Definition der Matrixmultiplikation besagt:
quelle
oΣz
kann seinδṁ
JavaScript (ES6), 66 Byte
quelle
C # 131 Bytes
Ich habe Yodles Lösung mit der Annahme gestohlen, dass ich dies effizienter mit LINQ schreiben könnte (im Gegensatz zu for-Schleifen). Ich habe ein paar Versuche unternommen, es aber etwas zerkleinert.
Hier ist es etwas aufgeschlüsselt:
Der einzige wirkliche "Trick" ist hier die Matrixtransponierung
B.First().Select((f, i) => B.Select(r => r.ElementAt(i)))
. Sobald wir die zweite Matrix transponieren, haben wir zwei ArraysA[i,x]
undB[j,x]
. Nehmen Sie das kartesische Produkt (i*j
) und packen Sie jedes dieserx
Längen-Arrays zusammen.Testcode:
quelle
using System.Linq
; Ich bin mir nicht sicher, ob Lösungen hier Boilerplate wieusing System
und enthalten müssenstatic void Main()
Haskell , 49 Bytes
Probieren Sie es online!
Eingabe und Ausgabe sind Spaltenlisten. Ordnet jede Spalte der zweiten Matrix dieser Zeile zu, zippt mit den Spalten der ersten Matrix und skaliert jede Spalte, summiert als Vektor.
Ich habe das Gefühl, dass es eine gute Möglichkeit geben muss, dies zu korrigieren und eine Handvoll Bytes zu sparen, aber ich sehe es noch nicht.
quelle
Javascript, 128 Bytes
Sie erhalten das Ergebnis, indem Sie nur $ überprüfen - es ist ein bisschen Betrug, aber hey, es hat ein paar Bytes gespart.
quelle
PHP, 110 Bytes
Drei Loops für die Elven Arrays. Das ist so einfach ... aber es gibt nicht viel zum Golfen.
quelle
Eigentlich 14 Bytes
Golfvorschläge willkommen! Probieren Sie es online!
Ungolfing
quelle
C 618 Bytes
Eine benannte Funktion und bei weitem die längste Einreichung hier, zum Teil aufgrund der Tatsache, dass das Konvertieren der Zeichenarray-Eingaben in C 2-dimensionale Ganzzahl-Arrays die meisten Bytes in Anspruch nimmt, und auch, weil ich in C die längste Zeit nicht Golf gespielt habe. Ich arbeite immer noch daran, dies so weit wie möglich zu verkürzen, und alle Tipps dazu sind sehr willkommen.
Damit wird die Eingabe über die Befehlszeile mit den zwei durch zwei Zeichenfolgen dargestellten Matrizen durchgeführt, wobei jede Zeile durch Kommas und jede Zeile durch durch Leerzeichen getrennte Ganzzahlen getrennt ist. Zum Beispiel die Matrizen:
würde eingegeben werden als:
./a.out "1 2 3,4 5 6,7 8 9" "44 52,67 -79,83 90"
Die resultierende Matrix wird als mehrzeilige Zeichenfolge an STDOUT ausgegeben. Die Ausgabe für die obige Eingabe wäre beispielsweise:
quelle
Clojure, 60 Bytes
Viele Bytes für die Umsetzung des zweiten Arguments.
quelle
Ruby , 59 Bytes
Probieren Sie es online!
quelle