En matemáticas, la multiplicación matricial o el producto matricial es una operación binaria que produce una matriz a partir de dos matrices. La definición está motivada por ecuaciones lineales y transformaciones lineales en vectores, que tienen numerosas aplicaciones en matemática aplicada, física e ingeniería. Más detalladamente, si A es una matriz n × m y B es una matriz m × p, su producto matriz AB es una matriz n × p, en la cual las entradas m en una fila de A se multiplican con las entradas m hacia abajo columnas de B y sumadas para producir una entrada de AB. Cuando dos transformaciones lineales están representadas por matrices, el producto matriz representa la composición de las dos transformaciones.
Fuente: Wikipedia
En otras palabras, para multiplicar dos matrices, por ejemplo:
1 2 3 1 4
2 3 4 × 3 1 =
3 4 5 4 6
Primero, tome la fila número 1 en la primera matriz, la columna número 1 en la segunda matriz y multiplique 1
por 1
, 2
por 3
y 3
por 4
.
1 × 1 = 1
2 × 3 = 6
3 × 4 = 12
Ahora agréguelos para obtener su primer artículo:
1 2 3 1 4 19
2 3 4 × 3 1 =
3 4 5 4 6
Para el segundo número en la primera columna del resultado, deberá tomar la fila número 2 en lugar de la fila número 1 y hacer lo mismo.
1 × 2 = 2
3 × 3 = 9
4 × 4 = 16
= 27
Después de hacer toda la primera columna, el resultado se ve así:
1 2 3 1 4 19
2 3 4 × 3 1 = 27
3 4 5 4 6 35
Ahora, vuelva a hacer exactamente lo mismo, pero tome la segunda columna en lugar de la primera columna, resultando en:
1 2 3 1 4 19 24
2 3 4 × 3 1 = 27 35
3 4 5 4 6 35 46
Tu tarea
Dadas dos matrices (dimensiones máximas 200x200), que contienen números en el rango de -10000 a 10000, donde el número de columnas en el primero es igual al número de filas en el segundo, multiplique el primero por el segundo. (La multiplicación de matrices no es conmutativa).
Puede tomar entrada y dar salida como una matriz de matrices (o equivalente), una matriz (si su idioma tiene ese formato) o una cadena multilínea.
No puede usar ninguna función integrada para la multiplicación de matrices.
Casos de prueba
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
Recuerde, este es el código de golf , por lo que gana el código con la menor cantidad de bytes.
Respuestas:
Jalea ,
75 bytesToma B y A como argumentos y devuelve A × B .
Pruébalo en línea!
Cómo funciona
fuente
æ×
, que es de 2 bytes.æ.
átomo.05AB1E , 13 bytes
Pruébalo en línea!
Explicación
fuente
εUøεX*O
Python 2,
6966 bytesEsto solo sigue la fórmula estándar, pero lambda-d para ser concisos :) ¡El código no protegido es extremadamente sencillo!
¡Gracias a Alexi Torhamo por guardar 3 bytes! :)
Código sin golf:
fuente
sum(map(int.__mul__,r,c))
para guardar 3 bytes. (No funcionará con coma flotante, pero tampoco era necesario)J,
139 bytes¡Guardado 4 bytes gracias a millas!
Este es un tenedor con tapa:
Lo que es equivalente a:
Que realiza la multiplicación deseada; estos se resumen a continuación.
Con un producto dot incorporado, 5 bytes:
+/ .*
Casos de prueba
fuente
[:+/*"#:~
9 bytesHaskell ,
57 5654 bytesPruébalo en línea!
Uso:
foldr(zipWith(:))e
cone=[]:e
es una forma más corta detranspose
.fuente
Haskell , 45 bytes
Pruébalo en línea!
Toma argumentos en orden inverso.
fuente
R, 66 bytes
Función sin nombre que toma dos matrices R como entrada y devuelve el producto. Utiliza el
apply
que se usa para aplicar funciones a través de los márgenes de las matrices. Funciona como unfor
bucle doble en este caso: para cada columna deB
y para cada fila deA
, devuelve la suma de los productos (vectorizados).Compare con el enfoque de bucle puro (
101
bytes):fuente
outer(A,B,`*`)
más que lasapply
llamadas incrustadas ?Mathematica, 20 bytes
Función anónima. Toma dos listas de números de rango 2 como entrada y devuelve una lista de números de rango 2 como salida. Para los curiosos,
Inner
es una función que hace una aplicación de multiplicación matricial de dos funciones a dos tensores.fuente
Inner[1##&,##]&
es equivalente aInner[1##&,##,Plus]&
...? Y así1##&~Inner~##&
sería aún mejor.C #,
168167 bytesGracias @Mukul Kumar por guardar 1 byte, el ciclo while fue más corto esta vez: P
Programa completo con casos de prueba:
fuente
for(;i<n;)
->while(i<n)
son ambos 10 bytes.for (;i <n;i++)
->while (i++<n)
ahorra 1 byteMATL ,
1211 bytesLas matrices se ingresan utilizando
;
como separador de filas.Pruébalo en línea!
La multiplicación de matrices sin la función integrada fue parte de mi respuesta a Showcase of languages . Sin embargo, al intentar reutilizar el código original para esta respuesta, me di cuenta de que tenía un error (la salida del vector de fila se convirtió incorrectamente en un vector de columna). Esto ahora está corregido, tanto aquí como allá. Para obtener una explicación de cómo funciona el código, consulte la publicación mencionada (fragmento de longitud 11).
fuente
C ++ 14,
173168156146 bytesC.back()
lugar contar coni
C.clear()
y requerirC
estar vacío al inicioComo lambda sin nombre:
Requiere entrada y salida ya que la
vector<vector<int>>
salida debe estar vacía de antemano.Sin golf:
Muestra:
fuente
push_back()
lugar deemplace_back()
?Casco ,
76 bytesTenga en cuenta el orden de los argumentos, ¡ pruébelo en línea!
-1 byte gracias a @Zgarb!
Explicación
Básicamente solo haciendo lo que dice la definición de multiplicación de matrices:
fuente
oΣz
puede serδṁ
JavaScript (ES6), 66 bytes
fuente
C #, 131 bytes
Robé solución de Yodle con la suposición de que podría escribir esto utilizando más eficientemente LINQ (a diferencia de los bucles). Hizo algunos intentos pero lo aplastó un poco.
Aquí se desglosa un poco:
La única verdadera 'truco' aquí es la transpuesta de la matriz,
B.First().Select((f, i) => B.Select(r => r.ElementAt(i)))
. Una vez que transponemos la segunda matriz, tenemos dos matricesA[i,x]
yB[j,x]
. Tome el producto cartesiano (i*j
) y comprima cada uno de esosx
matrices de longitud juntas.Código de prueba:
fuente
using System.Linq
; No estoy seguro de si las soluciones aquí deben incluir repeticiones comousing System
ystatic void Main()
Haskell , 49 bytes
Pruébalo en línea!
Entrada y salida son listas de columnas. Asigna cada columna de la segunda matriz a esa fila, comprimida con las columnas de la primera matriz y escalando cada una, sumada como un vector.
Siento que debe haber una buena manera de hacer que este punto sea libre y guardar un puñado de bytes, pero aún no lo veo.
fuente
Javascript, 128 bytes
Obtiene el resultado simplemente marcando $: es un poco engañoso, pero bueno, ahorró algunos bytes.
fuente
PHP, 110 bytes
Tres bucles para las matrices élficas. Esto es muy sencillo ... pero no hay mucho para jugar al golf.
fuente
Realmente , 14 bytes
Sugerencias de golf bienvenidas! Pruébalo en línea!
No golfista
fuente
C, 618 bytes
Una función con nombre y con mucho la presentación más larga aquí, en parte debido al hecho de que convertir las entradas de la matriz de caracteres en matrices enteras bidimensionales C ocupa la mayor cantidad de bytes, y también porque no he jugado golf en C en el tiempo más largo. Todavía estoy trabajando en acortar esto tanto como puedo, y cualquier consejo al respecto es muy apreciado.
Ahora, con eso fuera del camino, esto toma información a través de la línea de comando con las dos matrices representadas por dos cadenas, cada una con las filas separadas por comas y cada fila representada por enteros separados por espacios. Por ejemplo, las matrices:
sería ingresado como:
./a.out "1 2 3,4 5 6,7 8 9" "44 52,67 -79,83 90"
La matriz resultante se envía a STDOUT como una cadena multilínea. Por ejemplo, la salida para la entrada anterior sería:
fuente
Clojure, 60 bytes
Muchos bytes gastados en la transposición del segundo argumento.
fuente
Ruby , 59 bytes
Pruébalo en línea!
fuente