En mathématiques, la multiplication matricielle ou le produit matriciel est une opération binaire qui produit une matrice à partir de deux matrices. La définition est motivée par des équations linéaires et des transformations linéaires sur des vecteurs, qui ont de nombreuses applications en mathématiques appliquées, en physique et en génie. Plus en détail, si A est une matrice n × m et B est une matrice m × p, leur produit matriciel AB est une matrice n × p, dans lequel les m entrées sur une ligne de A sont multipliées par les m entrées vers le bas a colonnes de B et additionnées pour produire une entrée de AB. Lorsque deux transformations linéaires sont représentées par des matrices, le produit matriciel représente la composition des deux transformations.
Source: Wikipedia
En d'autres termes, pour multiplier deux matrices, par exemple:
1 2 3 1 4
2 3 4 × 3 1 =
3 4 5 4 6
Tout d'abord, prenez la ligne numéro 1 dans la première matrice, la colonne numéro 1 dans la deuxième matrice et multipliez 1
par 1
, 2
par 3
et 3
par 4
.
1 × 1 = 1
2 × 3 = 6
3 × 4 = 12
Maintenant, ajoutez-les ensemble pour obtenir votre premier article:
1 2 3 1 4 19
2 3 4 × 3 1 =
3 4 5 4 6
Pour le deuxième numéro de la première colonne du résultat, vous devrez prendre la ligne numéro 2 au lieu de la ligne numéro 1 et faire la même chose.
1 × 2 = 2
3 × 3 = 9
4 × 4 = 16
= 27
Après avoir fait la première colonne entière, le résultat ressemble à ceci:
1 2 3 1 4 19
2 3 4 × 3 1 = 27
3 4 5 4 6 35
Maintenant, refaites exactement la même chose, mais prenez la deuxième colonne au lieu de la première, ce qui donne:
1 2 3 1 4 19 24
2 3 4 × 3 1 = 27 35
3 4 5 4 6 35 46
Ta tâche
Étant donné deux matrices (dimensions maximales 200x200), contenant des nombres compris entre -10000 et 10000, où le nombre de colonnes sur la première est égal au nombre de lignes sur la seconde, multipliez la première par la seconde. (La multiplication matricielle n'est pas commutative.)
Vous pouvez prendre des entrées et donner des sorties sous forme de tableau de tableaux (ou équivalent), de matrice (si votre langue a ce format) ou de chaîne multiligne.
Vous ne pouvez pas utiliser de modules intégrés pour la multiplication de matrice.
Cas de test
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
N'oubliez pas qu'il s'agit de code-golf , donc le code avec le moins d'octets gagne.
Réponses:
Gelée ,
75 octetsPrend B et A comme arguments et renvoie A × B .
Essayez-le en ligne!
Comment ça fonctionne
la source
æ×
, qui est de 2 octets.æ.
atome.05AB1E , 13 octets
Essayez-le en ligne!
Explication
la source
εUøεX*O
Python 2,
6966 octetsCela suit juste la formule standard, mais lambda-d pour plus de concision :) Le code non golfé est extrêmement simple!
Merci à Alexi Torhamo pour avoir économisé 3 octets! :)
Code non golfé:
la source
sum(map(int.__mul__,r,c))
pour enregistrer 3 octets. (Ne fonctionnera pas avec la virgule flottante, mais ce n'était pas nécessaire non plus)J,
139 octets4 octets enregistrés grâce aux miles!
Ceci est une fourche plafonnée:
Ce qui équivaut à:
Qui effectue la multiplication souhaitée; ceux-ci sont ensuite additionnés.
Avec un produit scalaire intégré, 5 octets:
+/ .*
Cas de test
la source
[:+/*"#:~
9 octetsHaskell ,
57 5654 octetsEssayez-le en ligne!
Usage:
foldr(zipWith(:))e
avece=[]:e
est une forme plus courte detranspose
.la source
Haskell , 45 octets
Essayez-le en ligne!
Prend les arguments dans l'ordre inverse.
la source
R, 66 octets
Fonction sans nom prenant deux matrices R en entrée et retourne le produit. Il utilise
apply
ce qui est utilisé pour appliquer des fonctions à travers les marges des tableaux. Cela fonctionne comme un doublefor
boucle dans ce cas: pour chaque colonne deB
et pour chaque ligne deA
, retourne la somme des produits (vectorisés).Comparer à l'approche pure pour la boucle (
101
octets):la source
outer(A,B,`*`)
plutôt que lesapply
appels intégrés ?Mathematica, 20 octets
Fonction anonyme. Prend deux listes de nombres de rang 2 en entrée et renvoie une liste de nombres de rang 2 en sortie. Pour les curieux,
Inner
c'est une fonction qui fait une application matricielle-multiplication de deux fonctions à deux tenseurs.la source
Inner[1##&,##]&
c'est équivalent àInner[1##&,##,Plus]&
...? Et ce1##&~Inner~##&
serait encore mieux.C #,
168167 octetsMerci @Mukul Kumar d'avoir sauvé 1 octet, la boucle while était en fait plus courte cette fois: P
Programme complet avec cas de test:
la source
for(;i<n;)
->while(i<n)
sont tous les deux de 10 octets.for (;i <n;i++)
->while (i++<n)
enregistre 1 octetMATL ,
1211 octetsLes matrices sont entrées en utilisant
;
comme séparateur de lignes.Essayez-le en ligne!
La multiplication matricielle sans la fonction intégrée faisait partie de ma réponse à Showcase of languages . Cependant, lorsque j'ai essayé de réutiliser le code d'origine pour cette réponse, j'ai réalisé qu'il y avait un bogue (la sortie du vecteur ligne a été incorrectement convertie en vecteur colonne). Ceci est maintenant corrigé, ici et là. Pour une explication du fonctionnement du code, consultez l'article référencé (extrait de longueur 11).
la source
C ++ 14,
173168156 156146 octetsC.back()
compter suri
C.clear()
et nécessitantC
d'être vide au démarrageEn tant que lambda sans nom:
Nécessite une entrée et une sortie car
vector<vector<int>>
et la sortie doit être vide au préalable.Non golfé:
Échantillon:
la source
push_back()
place deemplace_back()
?Husk ,
76 octetsVeuillez noter l'ordre des arguments, essayez-le en ligne!
-1 octet grâce à @Zgarb!
Explication
Fondamentalement, juste ce que dit la définition de la multiplication matricielle:
la source
oΣz
peut êtreδṁ
JavaScript (ES6), 66 octets
la source
C #, 131 octets
J'ai volé la solution de Yodle en supposant que je pouvais écrire cela plus efficacement en utilisant LINQ (par opposition aux boucles). A pris quelques tentatives, mais l'a quelque peu écrasé.
Ici, il se décompose un peu:
Le seul vrai « truc » est ici la matrice transposée,
B.First().Select((f, i) => B.Select(r => r.ElementAt(i)))
. Une fois que nous avons transposé la deuxième matrice, nous avons deux tableauxA[i,x]
etB[j,x]
. Prenez le produit cartésien (i*j
) et zippez chacun de cesx
tableaux de longueur ensemble.Code de test:
la source
using System.Linq
; Je ne sais pas si les solutions ici doivent inclure un passe-partout commeusing System
etstatic void Main()
Haskell , 49 octets
Essayez-le en ligne!
L'entrée et la sortie sont des listes de colonnes. Mappe chaque colonne de la deuxième matrice à cette ligne, zippée avec les colonnes de la première matrice et mise à l'échelle chacune, additionnée en tant que vecteur.
Je pense qu'il doit y avoir un bon moyen de rendre ce point gratuit et d'économiser une poignée d'octets, mais je ne le vois pas encore.
la source
Javascript, 128 octets
Vous obtenez le résultat en vérifiant simplement $ - c'est un peu de la triche, mais bon, cela a économisé quelques octets.
la source
PHP, 110 octets
Trois boucles pour les tableaux elfiques. C'est tellement simple ... mais il n'y a pas grand-chose au golf.
la source
En fait , 14 octets
Suggestions de golf bienvenues! Essayez-le en ligne!
Ungolfing
la source
C, 618 octets
Une fonction nommée et par loin la soumission la plus longue ici, en partie due au fait que la conversion des entrées du tableau de caractères en tableaux entiers en 2D prend le plus d'octets, et aussi parce que je n'ai pas joué au golf en C depuis le plus longtemps. Je travaille toujours à raccourcir cela autant que possible, et tous les conseils pour le faire sont très appréciés.
Maintenant, avec cela à l'écart, cela prend une entrée via la ligne de commande avec les deux matrices représentées par deux chaînes, chacune contenant les lignes séparées par des virgules et chaque ligne représentée par des entiers séparés par des espaces. Par exemple, les matrices:
serait entré comme:
./a.out "1 2 3,4 5 6,7 8 9" "44 52,67 -79,83 90"
La matrice résultante est sortie dans STDOUT sous la forme d'une chaîne multiligne. Par exemple, la sortie de l'entrée ci-dessus serait:
la source
Clojure, 60 octets
Beaucoup d'octets dépensés pour transposer le 2ème argument.
la source
Rubis , 59 octets
Essayez-le en ligne!
la source