Multiplicação de Matrizes
Informações básicas sobre a multiplicação de matrizes, tomo a linha da primeira matriz vezes cada coluna da segunda matriz (operação feita uma a uma, ou seja, a linha um da primeira matriz, vezes a coluna um da segunda matriz, depois a linha um da primeira matriz vezes a coluna dois da segunda matriz). Não apenas, pois nesta operação entre linha e coluna, o primeiro elemento da primeira linha da primeira matriz, será multiplicado pelo primeiro elemento, da primeira coluna da segunda matriz. E após somados as outras respectivas multiplicações.
A operação segue como no exemplo:
Os outros seguirão passos semelhantes.
O tamanho da matriz resultante é definida pela numero de linhas da 1° matriz, com o numero de colunas da 2° matriz. Neste exemplo, a 1° matriz tem 2 linhas, a 2° matriz tem 2 colunas. Assim 2 * 2, tendo então uma matriz 2x2, 2 linhas e 2 colunas.
Na programação, tomando o devido cuidado, podemos fazer a mesma operação.
Levando em consideração o index
ou seja o índice. Iremos manipular a matriz a partir dos índices.
Pense da seguinte forma, as linhas serão contadas pela esquerda, de cima para baixo:
As colunas serão contadas por cima, da esquerda para a direita:
Temos:
Então, para saber a quantidade de linhas de uma matriz basta matriz.length
, porque você vai saber quantos indices tem na matriz. E como não entrou em nenhum dos índices, vai ter como retorno a quantidade de vetores (linhas) que esta matriz tem (sem levar em consideração o tamanho do vetor).
int i = matriz.length;
Para saber a quantidade de colunas, de divisões, mas entrar em um linha e perguntar: qual o tamanho desta linha? Ou quantas posições tem este vetor? Assim, saberá quantas posições cabem dentro deste vetor. Logo: matriz[0].length
. Você fixa a primeira posição desta matriz, como se estivesse escolhendo a primeira linha, então pede o tamanho desta linha, desta forma:
int j = matriz[0].length;
Acessando a linha, para encontrar o tamanho do vetor, escolho um dos index da linha, e vejo o tamanho do vetor escolhido, visualmente, ficaria algo semelhante:
ou
Multiplicação das matrizes
Na multiplicação será empregado 3 for
's, um para percorrer até a quantidade de colunas da primeira matriz. O segundo é para percorrer até a quantidade de colunas da segunda matriz. O terceiro for é para ir até a quantidade de linhas da segunda matriz.
O código fica assim:
for(int i = 0; i < linhasMatrizA; i++){
for(int j = 0; j < colunasMatrizB; j++){
for(int k = 0; k < linhasMatrizB; k++){
soma += matrizA[i][k] * matrizB[k][j];
}
matrizC[i][j] = soma;
soma = 0;
}
}
Como há um loop dentro do outro, ele só pode continuar quando o outro terminar. Então o i será o mesmo valor até os loops do j, e k terminarem. Somente por fim, mudará de valor.
Na multiplicação, preste atenção que na primeira matriz, o que segue variando a coluna, enquanto que a linha é fixa (por isso que matrizA
tem como linha, o valor de i
, porque i
neste caso esta fixo, pois esta dentro do loop de j
e k
, então vai ser dependente da mudança de k
). Já na segunda matriz, o que será fixo será a coluna, variando a linha.
Fazendo a multiplicação da primeira linha da primeira matriz com a primeira coluna da segunda matriz:
Levando em consideração agora os indices:
Se tratando dos elementos que vem primeiro nas multiplicações, a linha não muda, o que muda sãos as colunas (linhas em azul, colunas em verde). Já no segundo elemento das multiplicações, o que altera é a linha, enquanto que a coluna fica fixo.
Assim, há uma variação inversa, enquanto um varia a linha, outro a coluna. Porém, para este caso de multiplicação de matrizes, a variação tem o mesmo tamanho, enquanto a coluna da primeira matriz varia de 0 até 2, a variação da linha da segunda matriz, também segue de 0 até 2. logo, são os mesmos valores.
Por este motivo a variável k
em nosso exemplo fica como índice de mudança nas matrizes. Porque ele tem o mesmo numero de colunas da primeira matriz e o mesmo numero de linhas da segunda matriz.
Um detalhe, porque j
vai até o número de colunas da segunda matriz? Porque a linha da primeira matriz será multiplicada por todas as colunas da segunda matriz, sendo assim, a quantidade de vezes que a linha irá mudar multiplicar.