Hay muchas formas diferentes de explicar la multiplicación de matrices. Me quedaré con una sola figura, ya que creo que la mayoría de las personas aquí están familiarizadas con ella (y la figura es muy descriptiva). Si desea información más detallada, le sugiero que visite el artículo de Wikipedia o la explicación sobre WolframMathWorld .
Explicación simple:
Suponga que tiene dos matrices, A y B , donde A es 3 por 2 y B es 2 por 3. Si realiza la multiplicación de matrices en estas matrices, ya sea AB o BA , obtendrá los resultados a continuación:
Reto:
Implemente la multiplicación simbólica de matrices en su idioma. Deberá tomar dos matrices como entrada, donde cada elemento de las matrices está representado por un carácter ASCII sin espacios en blanco (puntos de código 33-126). Debe generar el producto de estas matrices.
Reglas con respecto a la salida:
Un producto de dos entradas no tendrá ningún símbolo en el medio. Es ab
, no a*b
, a·b
, times(a,b)
o algo similar. Es aa
, no a^2
.
La suma de términos debe tener un espacio (punto de código ASCII 32) en el medio. Es a b
, no a+b
, plus(a,b)
o algo similar.
La justificación de esas dos reglas es: todos los caracteres que no sean espacios en blanco están permitidos como símbolos en las matrices, por lo que usarlos como símbolos matemáticos sería complicado. Entonces, lo que normalmente podrías escribir como a*b+c*d
será ab cd
.
Puede elegir el orden de los términos. ab cd
, dc ab
y cd ba
matemáticamente hablando lo mismo, así que puedes elegir el orden aquí también. El orden no necesita ser consistente siempre que sea matemáticamente correcto.
Reglas sobre el formato de matriz:
Se puede ingresar una matriz en el formato que desee, excepto una sola cadena sin delimitadores entre filas (esto se debe a que la salida estaría completamente desordenada). Ambas matrices deben ingresarse en el mismo formato. Todos los ejemplos a continuación son formas válidas de ingresar y emitir una matriz.
"ab;cd" <- This will look awful, but it's still accepted.
"a,b\nc,d"
[[a,b],[c,d]]
[a, b]
[c, d]
Soy consciente de que esto permite muchos formatos que se verán desordenados, pero el desafío consiste en multiplicar matrices, no formatear la salida.
Reglas generales:
- Puede asumir una entrada válida. La multiplicación de matrices siempre será posible con las dimensiones dadas.
- Solo habrá dos matrices.
- Puede suponer que las matrices no están vacías
- Se aceptan funciones incorporadas (pero probablemente un poco engorrosas debido a los requisitos de formato).
- Por supuesto, puede usar caracteres de escape en la entrada si es necesario (en
\'
lugar de'
). - Cualquier método de entrada y salida estándar está bien .
Casos de prueba:
Las dos matrices de entrada se muestran con una línea vacía en el medio. La salida se muestra después Output:
. Cuando hay dos matrices de salida, es solo para mostrar otras salidas que serían aceptadas.
Caso de prueba n. ° 1
Inputs:
[a]
[b]
Output:
[ab]
[ba] <- Also OK
Caso de prueba n. ° 2
Inputs:
[a, b]
[1, 4]
[y, {]
[%, 4, 1]
[a, b, c]
Output:
[a% ba, a4 bb, a1 bc]
[1% 4a, 14 4b, 11 4c]
[y% {a, y4 {b, y1 {c]
Caso de prueba # 3:
Inputs:
[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 1, 2, 3]
[4, 5, 6, 7]
[a]
[b]
[c]
[d]
Output:
[1a 2b 3c 4d]
[5a 6b 7c 8d]
[9a 1b 2c 3d]
[4a 5b 6c 7d]
[d4 c3 b2 a1] <-- Also OK
[d8 c7 b6 a5]
[1b 9a c2 3d]
[a4 b5 d7 6c]
Si su respuesta a las reglas sobre requerir en ab cd
lugar de a*b+c*d
es: debe evitar formatos de entrada / salida engorrosos , entonces me gustaría tener en cuenta que los formatos de entrada y salida son muy flexibles. El hecho de que no pueda usar *
y +
para productos y sumas puede dificultar el uso de un simple incorporado, pero no considero eso negativo.