Multiplicação de Matrizes

Oi!!

Tenho um programa que me faz a multiplicação de matrizes, mas precisava modificá-lo para:

  • Ser o utilizador a definir quantas colunas e linhas tem cada matriz
  • Inserir os valores de cada linha e coluna

Já procurei no forum e não consegui encontrar nada semelhante…

Alguem me pode ajudar?

Obrigado!

[code]
class MatrixMultiply{
public static void main(String[] args) {

    int array[][] = {{5,6,7},{4,8,9}};
	int array1[][] = {{6,4},{5,7},{1,1}};
	int array2[][] = new int[3][3];
	int x = array.length;

	System.out.println("Matrix 1 : ");
	for(int i = 0; i < x; i++) {
		for(int j = 0; j <= x; j++) {
			System.out.print(" "+ array[i][j]);
		}
	System.out.println();
	}	
	int y = array1.length;
	System.out.println("Matrix 2 : ");

	for(int i = 0; i < y; i++) {
		for(int j = 0; j < y-1; j++) {
			System.out.print(" "+array1[i][j]);
		}  
	System.out.println();
    }
	
	for(int i = 0; i < x; i++) {
		for(int j = 0; j < y-1; j++) {
			for(int k = 0; k < y; k++){
				
				array2[i][j] += array[i][k]*array1[k][j];
			}
		}  
    }
	System.out.println("Multiply of both matrix : ");
	for(int i = 0; i < x; i++) {
		for(int j = 0; j < y-1; j++) {
			System.out.print(" "+array2[i][j]);
		}  
	System.out.println();
    }
}

}[/code]

E aê, swampps! blz?
Já tinha feito um projeto para faculdade referente a operações com matrizes. O projeto possui duas classes: uma referente à matriz e suas operações e a outra é a classe principal (que possui o método main). Vê se vc entende, caso contrário é só perguntar. Lá vai…

[code]
public class Matriz {
/**
* Armazena os elementos da matriz
*/
private double[][] elements;

/**
 * Armazena o número de colunas da matriz
 */
private int colunas;

/**
 * Armazena o número de colunas da matriz
 */
private int linhas;

/**
 * Cria uma instância da classe Matriz e configura os atributos linhas e
 * colunas de acordo com os argumentos recebidos (lin,col).
 * 
 * @param lin
 * @param col
 */
public Matriz(int lin, int col) {
	this.linhas = lin;// atribui o valor de lin a linhas
	this.colunas = col;// atribui o valor de col a colunas
	elements = new double[linhas][colunas];// cria um array de duas
	// dimensões utilizado para
	// armazenar os elementos de uma
	// Matriz com os números de
	// linhas e colunas
	// especificados.
}

/**
 * Este método realiza a operação de soma entre duas matrizes que são
 * recebidas como argumentos e retorna a matriz soma.
 * 
 * @param m1
 * @param m2
 * @return
 */
public static Matriz somarMatrizes(Matriz matriz1, Matriz matriz2) {// O
	// método
	// é
	// estático
	// porque a
	// operação de
	// soma pertence
	// a classe
	// Matriz, desta
	// forma, não há
	// necessidade
	// de criar
	// objetos desta
	// para realizar
	// a soma.
	Matriz matrizSoma = null;// result representa a matriz soma.
	if (matriz1 != null && matriz2 != null) {// verifica se as matrizes
		// recebidas
		// como argumentos não são nulas.
		if (matriz1.linhas == matriz2.linhas
				&& matriz1.colunas == matriz2.colunas) {// verifica
			// se as
			// duas
			// matrizes
			// (matriz1,matriz2)
			// podem
			// ser
			// somadas.
			matrizSoma = new Matriz(matriz1.linhas, matriz1.colunas);// cria
			// a
			// matriz
			// soma com o mesmo
			// número de linhas
			// e colunas da
			// matriz1(a
			// matriz2 possui
			// os mesmos números
			// de linhas e
			// colunas).
			for (int i = 0; i < matriz1.elements.length; i++) {// loop para
				// percorrer as
				// linhas da
				// matriz onde i
				// representa a
				// linha.
				for (int j = 0; j < matriz1.elements[0].length; j++) {// loop
					// para
					// percorrer
					// as
					// colunas
					// da
					// matriz
					// onde
					// j
					// representa
					// a
					// coluna.
					matrizSoma.elements[i][j] = matriz1.elements[i][j]
							+ matriz2.elements[i][j];// O elemento da
					// matriz
					// resultado, especificado
					// por i e j, recebe o valor
					// da soma dos elementos de
					// matriz1 e matriz2 epecificados
					// pelas mesmas variáveis.
				}
			}
		} else {
			System.err.println("Erro: matrizes incompatíveis para soma");
		}
	} else {
		System.err.println("Erro: Matriz nula");
	}
	return matrizSoma;// retorn a matriz resultado
}

public static Matriz subtrairMatrizes(Matriz matriz1, Matriz matriz2) {
	Matriz matrizSubtracao = null;

	if (matriz1 != null && matriz2 != null) {// verifica se as matrizes
		// recebidas
		// como argumentos não são nulas.
		if (matriz1.linhas == matriz2.linhas
				&& matriz1.colunas == matriz2.colunas) {// verifica
			// se as
			// duas
			// matrizes
			// (matriz1,matriz2)
			// podem
			// ser
			// subtraídas.
			matrizSubtracao = new Matriz(matriz1.linhas, matriz1.colunas);// cria
			// a
			// matrizSubtracao
			// com o mesmo
			// número de linhas
			// e colunas da
			// matriz1(a
			// matriz2 possui
			// os mesmos números
			// de linhas e
			// colunas).
			for (int i = 0; i < matriz1.elements.length; i++) {// loop para
				// percorrer as
				// linhas da
				// matriz onde i
				// representa a
				// linha.
				for (int j = 0; j < matriz1.elements[0].length; j++) {// loop
					// para
					// percorrer
					// as
					// colunas
					// da
					// matriz
					// onde
					// j
					// representa
					// a
					// coluna.
					matrizSubtracao.elements[i][j] = matriz1.elements[i][j]
							- matriz2.elements[i][j];// O elemento da
					// matrizSubtracao, especificado
					// por i e j, recebe o valor
					// da subtração dos elementos de
					// matriz1 e matriz2 com os mesmos índices(i,j).
				}
			}
		} else {
			System.err
					.println("Erro: matrizes incompativeis para subtracao");
		}
	} else {
		System.err.println("Erro: Matriz nula");
	}
	return matrizSubtracao;// retorn a matrizSubtracao.

}



public double[][] getElements() {
	return elements;
}

/**
 * Multiplica uma matriz por um número inteiro.
 * 
 * @param matriz1
 * @param inteiro
 * @return Matriz
 */
public static Matriz mutiplicarMatrizPorInteiro(Matriz matriz1, int inteiro) {
	Matriz matrizMultiplicacaoPorInteiro = null;// declara a matriz que
	// receberá o resultado.

	if (matriz1 != null) {// verifica se a matriz1 não é nula.
		matrizMultiplicacaoPorInteiro = new Matriz(matriz1.linhas,
				matriz1.colunas);// cria a matriz que receberá o
		// resultado.
		/*
		 * percorre todos os elementos da matriz1.
		 */
		for (int i = 0; i < matriz1.elements.length; i++) {
			for (int j = 0; j < matriz1.elements[0].length; j++) {
				/*
				 * atribui a cada elemento(i,j) da
				 * matrizMultiplicacaoPorInteir o resultado do produto do
				 * elemento(i,j) da matriz1 pelo inteiro.
				 */
				matrizMultiplicacaoPorInteiro.elements[i][j] = matriz1.elements[i][j]
						* inteiro;
			}
		}
	} else {
		System.err.println("Erro: Matriz nula!");
	}
	return matrizMultiplicacaoPorInteiro;// retorna a
	// matrizMultiplicacaoPorInteiro.
}

/**
 * Verifica a igualdade entre duas matrizes.
 * 
 * @param matriz1
 * @param matriz2
 * @return result
 */
public static boolean saoIguais(Matriz matriz1, Matriz matriz2) {
	boolean result = true;// parte do suposto que ambas são iguais.
	if (matriz1 != null && matriz2 != null) {// verifica se as matrizes
												// não são nulas.
		if (matriz1.linhas == matriz2.linhas
				&& matriz1.colunas == matriz2.colunas) {// verifica se as
														// matrizes possuem
														// os mesmos números
														// de linha e
														// coluna.
			for (int i = 0; i < matriz1.elements.length; i++) {// percorre
																// as linhas
																// da matriz
				for (int j = 0; j < matriz2.elements[0].length; j++) {// percorre
																		// as
																		// colunas
																		// da
																		// matriz
					if (matriz1.elements[i][j] != matriz2.elements[i][j]) {// verifica
																			// se o
																			// elemento(i,j)
																			// são
																			// diferentes.
						return result = false;// retorna false caso
												// encontre algum
												// elemento(i,j) diferente
												// entre as matrizes.
					}
				}
			}
		}
	}
	return result;
}

/**
 * Recebe um número variável de elementos do tipo double e preenche as
 * lacunas da Matriz se forem compatíveis.
 * 
 * @param elements
 */
public void preencherMatriz(double... elements) {
	int totalElements = linhas * colunas;// verifica o número total de
	// elementos que a Matriz deve
	// receber
	int elementsIndex = 0;// índice do array recebido como
	// argumeto(elements).
	if (elements != null && elements.length == totalElements) {// verifica
		// se
		// elements
		// não é
		// nulo e o
		// tamanho
		// de elements
		// coincide
		// com o
		// numero de
		// elementos
		// da
		// matriz.
		for (int i = 0; i < linhas; i++) {// percorre as linhas da matriz
			for (int j = 0; j < colunas; j++) {// percorre as colunas da
				// matriz
				this.elements[i][j] = elements[elementsIndex++];// o
				// elemento
				// (i,j) da
				// matriz
				// recebe o
				// valor
				// contido
				// no índice
				// (elementsIndex) do array elements (passado como
				// argumento) e
				// depois incrementa elementsIndex em 1.
			}
		}
	} else {
		System.err
				.println("Erro: numero de elementos da matriz incorreto!");
		System.err.println("A matriz possui " + totalElements
				+ " elementos, mas você forneceu " + elements.length + ".");
		// System.exit(0);
	}
}

/**
 * Imprimi os elementos da matriz.
 */
public String toString() {
	String result = "";
	for (int i = 0; i < elements.length; i++) {
		for (int j = 0; j < elements[0].length; j++) {
			result += String.format("a(%d,%d)=%+4.2f  ", (i + 1), (j + 1),
					elements[i][j]);
		}
		result += "\n";
	}
	return result;
}

/**
 * Realiza a multiplicação entre duas matrizes.
 * 
 * @param matriz1
 * @param matriz2
 * @return Matriz
 */
public static Matriz multiplicarMatrizes(Matriz matriz1, Matriz matriz2) {
	Matriz matrizProduto = null;
	if (matriz1 != null && matriz2 != null) {// verifica se as matrizes
		// não são nulas
		if (matriz1.colunas == matriz2.linhas) {// verifica se as matrizes
			// podem ser multiplicadas
			matrizProduto = new Matriz(matriz1.linhas, matriz2.colunas);// cria
			// a
			// matriz
			// produto que deve ter o número de linhas da primeira matriz e
			// o número de colunas da segunda.
			for (int i = 0; i < matrizProduto.elements.length; i++) {// percorre
				// as
				// linhas
				// da
				// matrizProduto
				for (int j = 0; j < matrizProduto.elements[0].length; j++) {// percorre
					// as
					// colunas
					// da
					// matrizProduto
					double elementoMatrizProduto = 0;// armazena cada
					// elemento da
					// matriz produto
					// de acordo com a multiplicação
					// da linha da
					// matriz1 pela
					// coluna da
					// matriz2.
					for (int k = 0; k < matriz2.linhas; k++) {// loop para
						// realizar
						// a
						// multiplicação
						// das
						// linhas(matriz1)
						// pelas
						// colunas(matriz2).
						elementoMatrizProduto += matriz1.elements[i][k]
								* matriz2.elements[k][j];
					}
					matrizProduto.elements[i][j] = elementoMatrizProduto;// atribui
					// o
					// resultado
					// do
					// produto
					// ao
					// respectivo
					// elemento(i,j)
					// da
					// matrizProduto.
				}
			}

		} else {
			System.err
					.println("Erro: as matrizes não podem ser multiplicadas!");
			System.err
					.println("Verifique se o número de colunas da Matriz 1 é igual ao número de linhas da Matriz 2.");
		}
	} else {
		System.err.println("Erro: Matriz(es) nula(s)!");
	}
	return matrizProduto;
}

}[/code]

[code]
import java.util.InputMismatchException;
import java.util.Scanner;

public class Main {

/**
 * Ponto de execução inicial.
 * @param args
 */
public static void main(String[] args) {
	/*
	 * //testes 
	 * Matriz matriz1 = new Matriz(2, 2);
	 * matriz1.preencherMatriz(3, 1,1,4); Matriz matriz2 = new Matriz(2, 2);
	 * matriz2.preencherMatriz(3, 1,1,4); int inteiro = 3;
	 * System.out.println("Matriz 1"); System.out.println(matriz1);
	 * System.out.println("Matriz 2"); System.out.println(matriz2);
	 * System.out.println("Matriz 1 e Matriz 2 são iguais?");
	 * System.out.println(Matriz.saoIguais(matriz1, matriz2));
	 * System.out.println("Resultado de Matriz 1 + Matriz 2");
	 * System.out.println(Matriz.somarMatrizes(matriz1,
	 * matriz2).toString()); System.out.println("Resultado de Matriz 1 -
	 * Matriz 2"); System.out.println(Matriz.subtrairMatrizes(matriz1,
	 * matriz2).toString()); System.out.println("Resultado de (Matriz 1) X " +
	 * inteiro);
	 * System.out.println(Matriz.mutiplicarMatrizPorInteiro(matriz1,
	 * inteiro).toString()); System.out.println("Resultado de (Matriz 2) X " +
	 * inteiro);
	 * System.out.println(Matriz.mutiplicarMatrizPorInteiro(matriz2,
	 * inteiro).toString()); System.out.println("Resultado de Matriz 1 X
	 * Matriz 2"); System.out.println(Matriz.multiplicarMatrizes(matriz1,
	 * matriz2).toString());
	 */

	Scanner input = new Scanner(System.in);
	Matriz matrizes[] = new Matriz[2];

	for (int i = 0; i < 2; i++) {
		int lin = 0, col = 0;
		System.out.println("Matriz " + (i + 1));			
		try {
			System.out.print("digite o numero de linhas: ");
			lin = input.nextInt();
			System.out.print("digite o numero de colunas: ");
			col = input.nextInt();
		} catch (InputMismatchException e) {
			System.err.println("NUMERO DE LINHAS INVALIDO");
			lin = 3;
			col = 3;
		}			
		double[] elements = new double[lin * col];
		matrizes[i] = new Matriz(lin, col);
		System.out.println("preencha a matriz");
		int elementsIndex = 0;
		
		for (int j = 0; j < matrizes[i].getElements().length; j++) {
			for (int k = 0; k < matrizes[i].getElements()[0].length; k++) {
				System.out.print("a(" + (j + 1) + "," + (k + 1) + "): ");
				try {
					elements[elementsIndex++] = input.nextDouble();
				} catch (InputMismatchException e) {
					// TODO: handle exception
					System.err.println("ELEMENTO INVALIDO!");
					elements[elementsIndex++] = 0;
					
				}
				
			}
		}
		System.out.println();
		matrizes[i].preencherMatriz(elements);
		System.out.println(matrizes[i].toString());

	}

	boolean condition = true;
	do {
		int op = 0;
		System.out.println("Opcoes:");
		System.out.println("1 - calcular Matriz 1 + Matriz 2");
		System.out.println("2 - calcular Matriz 1 - Matriz 2");
		System.out.println("3 - calcular Matriz 1 X inteiro");
		System.out.println("4 - calcular Matriz 2 X inteiro");
		System.out.println("5 - calcular Matriz 1 X Matriz 2");
		System.out
				.println("6 - Verificar a igualdade entre Matriz 1 e Matriz 2");
		System.out.println("7 - sair");
		System.out.print("Digite a opcao: ");
		try {
			op = input.nextInt();
		} catch (InputMismatchException e) {
			// TODO: handle exception
			System.err.println("OPCAO INVALIDA!" );
			op = 7;
		}
		

		switch (op) {
		case 1:
			System.out.println("Matriz 1 + Matriz 2");
			Matriz matrizSoma = Matriz.somarMatrizes(matrizes[0],
					matrizes[1]);
			System.out.println(matrizSoma);
			System.out.println();
			break;
		case 2:
			System.out.println("Matriz 1 - Matriz 2");
			Matriz matrizSubtracao = Matriz.subtrairMatrizes(matrizes[0],
					matrizes[1]);
			System.out.println(matrizSubtracao);
			System.out.println();
			break;
		case 3:
			System.out.println("Matriz 1 X inteiro");
			int inteiro = 0;
			try {
				System.out.print("Digite o inteiro: ");
				inteiro = input.nextInt();
			} catch (InputMismatchException e) {
				// TODO: handle exception
				System.err.println("ERRO: NUMERO INVALIDO!");
				inteiro = 1;
			}
			
			Matriz matrizProdutoPorInteiro = Matriz
					.mutiplicarMatrizPorInteiro(matrizes[0], inteiro);
			System.out.println(matrizProdutoPorInteiro);
			System.out.println();
			break;
		case 4:
			System.out.println("Matriz 2 X inteiro");
			int inteiro2 = 0;
			try {
				System.out.print("Digite o inteiro: ");
				inteiro2 = input.nextInt();
			} catch (InputMismatchException e) {
				// TODO: handle exception
				System.err.println("ERRO: NUMERO INVALIDO!");
				inteiro2 = 1;
			}
			System.out.print("Digite o inteiro: ");
			inteiro2 = input.nextInt();
			Matriz matrizProdutoPorInteiro2 = Matriz
					.mutiplicarMatrizPorInteiro(matrizes[1], inteiro2);
			System.out.println(matrizProdutoPorInteiro2);
			System.out.println();
			break;
		case 5:
			System.out.println("Matriz 1 X Matriz 2");
			Matriz matrizProduto = Matriz.multiplicarMatrizes(matrizes[0],
					matrizes[1]);
			System.out.println(matrizProduto);
			System.out.println();
			break;
		case 6:
			System.out.print("A Matriz 1 e igual a Matriz 2: ");
			System.out.println(Matriz.saoIguais(matrizes[0], matrizes[1]));
			System.out.println();
			break;
		case 7:
			System.out.println("APLICACAO FINALIZADA!");
			System.exit(0);				
			break;
		default:
			condition = false;
			break;
		}

	} while (condition);

}

}[/code]

Vc pode retirar apenas a parte que te interessa (multiplicação entre matrizes). Espero ter ajudado!

Obrigado mesmo !

Vou ver isso agora!!

oi cara!!

valeu!

ja lhe fiz as modificações que precisava, mas na tou encontrando a parte do código que mantem o programa correndo ate se digitar 7…

Obrigado!!

Já encontrei o erro… tava usando mal o while… :oops:

Obrigado por tudo!

oi galera !!!

alguem pode me ajudar :?: :frowning:

eu tenho um exercicio pq tenho um duvido :frowning:

exercicio uma pergunta la em baixo:

:arrow: Leia o conteudo de duas matrizes e faça a multiplicaçao das mesmas. :?:

Como fazer isso??? por favor, faz pra mim ai. :cry:

abraçosss pra ti