[RESOLVIDO]Erro na multiplicação de Matriz

Estou tentando rodar este código, porém não há retorno compatível na função Multiplicar a matriz (O valor devolvido não bate com o calculo real).
Tem como dar um Help? Já procurei em demais tópicos e estou utilizando sintáxe parecida com os demais.
Att.

package teste;

import java.util.Scanner;

/**
 *
 * @author wnx
 *
 */
public class Teste {

    public static void main(String[] args) {

        //Declaração de variáveis
        int lerDados;
        int qtdCol;

        //Instruções de menu: 
        Scanner s = new Scanner(System.in);
        System.out.println(" *** SISTEMA DE CÁLCULO DE MATRIZES *** ");
        System.out.println("");
        System.out.println("MENU DE OPÇÕES: ");
        System.out.println("");
        System.out.println("1 - Inserir inserir informações sobre as Matrizes A e B");

        System.out.println("0 - Finalizar aplicação");
        //System.out.println("4 - Solicitar multiplicação entre as Matrizes");*/
        System.out.println("");

        //Leitura de dados Menu
        System.out.print("Informe a opção desejada: ");
        lerDados = s.nextInt();

        System.out.println("Trabalharemos com matrizes quadradas"
                + " informe a quantidade de Linhas: ");
        qtdCol = s.nextInt();
        System.out.println("");
        System.out.println("As matrizes terão " + qtdCol + " linhas e " + qtdCol
                + " colunas.");

        //Declaração de Matriz
        int[][] matriz1 = new int[qtdCol][qtdCol];
        int[][] matriz2 = new int[qtdCol][qtdCol];
        int[][] mtResultante = new int[matriz1.length][matriz2[0].length];
        int[][] mtResultanteX = new int[matriz1.length][matriz2[0].length];

        if (lerDados == 1) {

            System.out.println("");
            System.out.println("Insira os valores da  Matriz A");
            System.out.println("");

            for (int x = 0; x < matriz1.length; x++) {

                for (int y = 0; y < matriz1.length; y++) {

                    System.out.println("Informe o valor da posição " + (y + 1)
                            + " da linha " + (x + 1));
                    matriz1[x][y] = s.nextInt();
                }
            }

            //Impressão de Matrizes    
            for (int l = 0; l < matriz1.length; l++) {

                for (int a = 0; a < matriz1.length; a++) {
                    System.out.print(matriz1[l][a] + " ");
                }
                System.out.println("");

            }
            System.out.println("");
            System.out.println("Insira os valores da  Matriz B");
            System.out.println("");

            for (int x = 0; x < matriz2.length; x++) {

                for (int y = 0; y < matriz2.length; y++) {
                    System.out.println("Informe o valor da posição " + (y + 1)
                            + " da linha " + (x + 1));
                    matriz2[x][y] = s.nextInt();

                }

            }

            //Impressão de Matrizes    
            for (int l = 0; l < matriz2.length; l++) {

                for (int a = 0; a < matriz2.length; a++) {
                    System.out.print(matriz2[l][a] + " ");
                }
                System.out.println("");

            }
            System.out.println("Matriz Resultante da Operação SOMA:");

            for (int r = 0; r < mtResultante.length; r++) {
                for (int x = 0; x < matriz1.length; x++) {
                    for (int y = 0; y < matriz2.length; y++) {
                        mtResultante[x][y] = (matriz1[x][y] + matriz2[x][y]);

                    }
                }
            }
            //Impressão de Matrizes    
            for (int l = 0; l < mtResultante.length; l++) {

                for (int a = 0; a < mtResultante.length; a++) {
                    System.out.print(mtResultante[l][a] + " ");
                }
                System.out.println("");

            }

            System.out.println("Matriz Resultante da Operação MULTIPLICAÇÃO (Produto)");

            int somase = 0;

            for (int r = 0; r < mtResultanteX.length; r++) {

                for (int x = 0; x < mtResultanteX.length; x++) {

                    for (int y = 0; y < mtResultanteX.length; y++) {

                        mtResultanteX[r][x] = mtResultanteX[r][x] + matriz1[x][y] * matriz2[x][y];

                    }
                    
                    System.out.println("Linha: " + (r + 1) + " Coluna: "
                            + (x + 1) + " = " + mtResultanteX[r][x]);
                }

            }
            //Impressão de Matrizes    
            for (int l = 0; l < mtResultanteX.length; l++) {

                for (int a = 0; a < mtResultanteX.length; a++) {
                    System.out.print(mtResultanteX[l][a] + " ");
                }
                System.out.println("");

            }
        }

        if (lerDados == 0) {
            System.out.println("");
            System.out.println("Obrigado por utilizar nossa aplicação. Volte sempre!");
            System.out.println("");
            System.exit(0);
        } 
    }

}

A regra para a multiplicação das matrizes quadradas é: multiplica-se cada elemento da primeira linha da matriz multiplicadora por cada elementos da primeira coluna da matriz multiplicando. Assim obtém-se o primeiro elemento da matriz resultante. Depois, cada elemento da primeira linha da matriz multiplicadora por cada elemento da próxima coluna da matriz multiplicando. Assim obtém-se o segundo elemento da matriz resultante. Repete-se o processo até que esgote o número de colunas da matriz multiplicando. Esgotado as colunas dessa matriz, passasse para a próxima linha da matriz multiplicadora e repete-se o processo.
Se utilizarmos um teste de mesa:

Suponhamos a matriz a{{2, 3, 1}, {-1, 0, 2}} e a matriz b = {{1, -2}, {0, 5}, {4, 1}}:

a[0][0] = 2
a[0][1] = 3
a[0][2] = 1
a[1][0] = -1
a[1][1] = 0
a[1][2] = 2

b[0][0] = 1
b[0][1] = -2
b[1][0] = 0
b[1][1] = 5
b[2][0] = 4
b[2][1] = 1

a x b

r = r + a[0][0] x b[0][0];		//r = 0 + 2 x 1 = 2
r = r + a[0][1] x b[1][0];		//r = 2 + 3 x 0 = 2
r = r + a[0][2] x b[2][0];		//r = 2 + 1 x 4 = 6

r = 6

r1 = r1 + a[0][0] x b[0][1];	//r1 = 0 + 2 x (-2) = -4
r1 = r1 + a[0][1] x b[1][1];	//r1 = (-4) + 3 x 5 = 11
r1 = r1 + a[0][2] x b[2][1];	//r1 = 11 + 1 x 1 = 12

r1 = 12

Consegue ver o padrão?

Um teste:

import java.util.Scanner;

public class ProdutoMatricial {
	private int[][] matrizA; //Matriz multplicadora
	private int[][] matrizB; //Matriz multiplicando
	private int[][] matrizC; //Matriz produto ou resultante
	
	public static void main(String[] args){
		ProdutoMatricial produto = new ProdutoMatricial();
		produto.lerDados();
		produto.exibirMatriz(0);
		produto.exibirMatriz(1);
		produto.calcularProdutoMatricial();
		produto.exibirMatriz(2);
	}
	
	private void lerDados(){
		short linhas;
		short colunas;
		Scanner leitor = new Scanner(System.in);
		
		System.out.print("\nInforme o número de linhas da matriz A: ");
		linhas = leitor.nextShort();
		
		System.out.print("Informe o número de colunas da matriz A: ");
		colunas = leitor.nextShort();
		
		matrizA = new int[linhas][colunas];
		
		preencherMatriz('A');
		
		linhas = 0;
		colunas = 0;
		System.out.print("\nInforme o número de linhas da matriz B: ");
		linhas = leitor.nextShort();
		
		System.out.print("Informe o número de colunas da matriz B: ");
		colunas = leitor.nextShort();
		
		matrizB = new int[linhas][colunas];
		
		preencherMatriz('B');
		
		matrizC = new int[matrizB[0].length][matrizA.length];
	}
	
	private void preencherMatriz(char nomeMatriz){
		Scanner leitor = new Scanner(System.in);
		
		System.out.println("\n");
		if(matrizA != null && nomeMatriz == 'A'){
			for(short i = 0; i < matrizA.length; i++){
				for(short j = 0; j < matrizA[0].length; j++){
					System.out.print("A[" + i + "][" + j + "]= ");
					matrizA[i][j] = leitor.nextInt();
				}
			}
		}
		
		if(matrizB != null && nomeMatriz == 'B'){
			for(short i = 0; i < matrizB.length; i++){
				for(short j = 0; j < matrizB[0].length; j++){
					System.out.print("B[" + i + "][" + j + "]= ");
					matrizB[i][j] = leitor.nextInt();
				}
			}
		}
	}
	
	private void lerMatriz(int[][] matriz){
		System.out.println("\nMatriz lida:\n");
		for(short i = 0; i < matriz.length; i++){
			for(short j = 0; j < matriz[0].length; j++){
				System.out.printf("%05d ", matriz[i][j]);
			}
			System.out.println("");
		}
	}
	
	private void exibirMatriz(int opcao){
		switch(opcao){
			case 0: 
				if(matrizA != null)
					lerMatriz(matrizA);
				else
					System.out.println("\nA matriz A não foi gerada!");
				break;
			case 1:
				if(matrizB != null)
					lerMatriz(matrizB);
				else
					System.out.println("\nA matriz B não foi gerada!");
				break;
			case 2:
				if(matrizC != null)
					lerMatriz(matrizC);
				else
					System.out.println("\nA matriz C não foi gerada!");
				break;
			default: 
				System.out.println("\nOpção inválida!");
		}
	}
	
	private void calcularProdutoMatricial(){
		if(matrizA != null && matrizB != null){
			if(matrizA.length == matrizB[0].length){//Verifica se são quadradas
				for(short i = 0; i < matrizA.length; i++){
					for(short j = 0; j < matrizB[0].length; j++){
						for(short k = 0; k < matrizB.length; k++){
							matrizC[i][j] += matrizA[i][k] * matrizB[k][j];
						}
					}
				}
			}else
				System.out.println("\nAs matrizes não são quadradas!");
			
		}else
			System.out.println("\nUma ou ambas as matrizes são inválidas!");
	}
}

Rodando…

image
image

1 curtida

Nuuuh!! Excelente! Muito obrigado pela dica, estava me perdendo! Salvou demais!

Obrigado!