Em matemática, a multiplicação da matriz ou o produto da matriz é uma operação binária que produz uma matriz a partir de duas matrizes. A definição é motivada por equações lineares e transformações lineares em vetores, que têm inúmeras aplicações em matemática aplicada, física e engenharia. Mais detalhadamente, se A é uma matriz n × m e B é uma matriz m × p, o produto da matriz AB é uma matriz n × p, na qual as entradas m em uma linha de A são multiplicadas pelas entradas m em uma colunas de B e somadas para produzir uma entrada de AB. Quando duas transformações lineares são representadas por matrizes, o produto da matriz representa a composição das duas transformações.
Fonte: Wikipedia
Em outras palavras, multiplicar duas matrizes, por exemplo:
1 2 3 1 4
2 3 4 × 3 1 =
3 4 5 4 6
Primeiro, pegue o número da linha 1 na primeira matriz, o número da coluna 1 na segunda matriz e multiplique 1
por 1
, 2
por 3
e 3
por4
.
1 × 1 = 1
2 × 3 = 6
3 × 4 = 12
Agora adicione-os para obter o seu primeiro item:
1 2 3 1 4 19
2 3 4 × 3 1 =
3 4 5 4 6
Para o segundo número na primeira coluna do resultado, você precisará pegar o número da linha 2 em vez da linha 1 e fazer a mesma coisa.
1 × 2 = 2
3 × 3 = 9
4 × 4 = 16
= 27
Depois de fazer a primeira coluna inteira, o resultado fica assim:
1 2 3 1 4 19
2 3 4 × 3 1 = 27
3 4 5 4 6 35
Agora, faça a mesma coisa exata novamente, mas pegue a segunda coluna em vez da primeira, resultando em:
1 2 3 1 4 19 24
2 3 4 × 3 1 = 27 35
3 4 5 4 6 35 46
Sua tarefa
Dadas duas matrizes (dimensões máximas 200x200), contendo números no intervalo -10000 a 10000, em que o número de colunas na primeira é igual ao número de linhas na segunda, multiplique a primeira pela segunda. (A multiplicação de matrizes não é comutativa.)
Você pode receber e fornecer saída como uma matriz de matrizes (ou equivalente), uma matriz (se o seu idioma tiver esse formato) ou uma sequência de linhas múltiplas.
Você não pode usar nenhum componente interno para multiplicação de matrizes.
Casos de teste
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
Lembre-se, isso é código-golfe , então o código com o menor número de bytes vence.
Respostas:
Geléia ,
75 bytesPega B e A como argumentos e retorna A × B .
Experimente online!
Como funciona
fonte
æ×
é de 2 bytes.æ.
átomo.05AB1E , 13 bytes
Experimente online!
Explicação
fonte
εUøεX*O
Python 2,
6966 bytesIsso apenas segue a fórmula padrão, mas lambda-d por concisão :) O código não-bloqueado é extremamente direto!
Obrigado a Alexi Torhamo por salvar 3 bytes! :)
Código não destruído:
fonte
sum(map(int.__mul__,r,c))
para salvar 3 bytes. (Não funciona com ponto flutuante, mas que não foi necessário, qualquer um)J,
139 bytesEconomizou 4 bytes graças a milhas!
Este é um garfo com tampa:
O que equivale a:
Qual realiza a multiplicação desejada; estes são então somados.
Com um produto escalar incorporado, 5 bytes:
+/ .*
Casos de teste
fonte
[:+/*"#:~
9 bytesHaskell ,
57 5654 bytesExperimente online!
Uso:
foldr(zipWith(:))e
come=[]:e
é uma forma mais curta detranspose
.fonte
Haskell , 45 bytes
Experimente online!
Recebe argumentos em ordem inversa.
fonte
R, 66 bytes
Função sem nome, tendo duas matrizes R como entrada e retornando o produto. Utiliza o
apply
que é usado para aplicar funções nas margens das matrizes. Funciona exatamente como umfor
loop duplo neste caso: para cada coluna deB
e para cada linha deA
, retorne a soma dos produtos (vetorizados).Compare com a abordagem pura para loop (
101
bytes):fonte
outer(A,B,`*`)
asapply
chamadas incorporadas ?Mathematica, 20 bytes
Função anônima. Pega duas listas de números de classificação 2 como entrada e retorna uma lista de números de classificação 2 como saída. Para os curiosos,
Inner
é uma função que faz uma aplicação semelhante à multiplicação de matrizes de duas funções a dois tensores.fonte
Inner[1##&,##]&
é equivalente aInner[1##&,##,Plus]&
...? E assim1##&~Inner~##&
seria ainda melhor.C #,
168167 bytesObrigado @Mukul Kumar por economizar 1 byte, o loop while foi realmente mais curto desta vez: P
Programa completo com casos de teste:
fonte
for(;i<n;)
->while(i<n)
são ambos 10 bytes.for (;i <n;i++)
->while (i++<n)
salva 1 byteMATL ,
1211 bytesAs matrizes são inseridas usando
;
como separador de linhas.Experimente online!
A multiplicação de matrizes sem o builtin fazia parte da minha resposta ao Showcase of languages . No entanto, ao tentar reutilizar o código original para esta resposta, percebi que havia um erro (a saída do vetor de linha foi convertida incorretamente em um vetor de coluna). Isso agora está corrigido, aqui e ali. Para obter uma explicação de como o código funciona, consulte a publicação referida (trecho de comprimento 11).
fonte
C ++ 14,
173168156146 bytesC.back()
vez disso, contar comi
C.clear()
e exigirC
que esteja vazio no inícioComo lambda sem nome:
Requer entrada e saída, pois a
vector<vector<int>>
saída deve estar vazia previamente.Ungolfed:
Amostra:
fonte
push_back()
vez deemplace_back()
?Casca ,
76 bytesObserve a ordem dos argumentos, tente online!
-1 byte graças a @Zgarb!
Explicação
Basicamente, apenas fazendo o que a definição de multiplicação de matrizes sais:
fonte
oΣz
pode serδṁ
JavaScript (ES6), 66 bytes
fonte
C #, 131 bytes
eu roubei a solução de Yodle com a suposição de que eu poderia escrever isso de maneira mais eficiente usando o LINQ (em vez de loops). Tomou algumas tentativas, mas a triturou um pouco.
Aqui está dividido um pouco:
O único "truque" real aqui é a transposição da matriz
B.First().Select((f, i) => B.Select(r => r.ElementAt(i)))
,. Depois de transpormos a segunda matriz, temos duas matrizesA[i,x]
eB[j,x]
. Pegue o produto cartesiano (i*j
) e feche cada uma dessasx
matrizes de comprimento.Código do teste:
fonte
using System.Linq
; Não tenho certeza se as soluções aqui precisam incluir clichês comousing System
estatic void Main()
Haskell , 49 bytes
Experimente online!
Entrada e saída são listas de colunas. Mapeia cada coluna da segunda matriz para essa linha, compactada com as colunas da primeira matriz e dimensionando cada uma, somada como um vetor.
Eu sinto que deve haver uma boa maneira de tornar isso livre de pontos e salvar um punhado de bytes, mas ainda não estou vendo.
fonte
Javascript, 128 bytes
Você obtém o resultado apenas verificando $ - é meio trapaça, mas ei, economizou alguns bytes.
fonte
PHP, 110 bytes
Três voltas para os elfos. Isso é tão direto ... mas não há muito para jogar golfe.
fonte
Na realidade , 14 bytes
Sugestões de golfe são bem-vindas! Experimente online!
Ungolfing
fonte
C, 618 bytes
Uma função nomeada e por longe, a submissão mais longa aqui, em parte devido ao fato de que converter as entradas da matriz de caracteres em matrizes inteiras bidimensionais em C está ocupando mais bytes, e também porque eu não pratico golfe em C há mais tempo. Ainda estou trabalhando para encurtar isso o máximo possível, e todas as dicas para isso são muito apreciadas.
Agora, com isso fora do caminho, isso leva a entrada através da linha de comando com as duas matrizes representadas por duas seqüências, cada uma contendo as linhas separadas por vírgulas e cada linha representada por números inteiros separados por espaço. Por exemplo, as matrizes:
seria inserido como:
./a.out "1 2 3,4 5 6,7 8 9" "44 52,67 -79,83 90"
A matriz resultante é enviada para STDOUT como uma sequência multilinha. Por exemplo, a saída para a entrada acima seria:
fonte
Clojure, 60 bytes
Muitos bytes gastos na transposição do segundo argumento.
fonte
Ruby , 59 bytes
Experimente online!
fonte