Operação com 2 matrizes

Considere o seguinte trecho de código

import java.util.Scanner;

public class Matriz {
	private double mat[][];
	private int m;
	private int n;
			
	public Matriz (int l, int c){
		m = l;
		n = c;
		mat = new double [m][n];
	}
	
	public void lerMatriz(){
		Scanner input = new Scanner(System.in);
		
		for (int i = 0; i < m; i++) {   
            for (int j = 0; j < n; j++) {   
                System.out.println("Digite o elemento da linha [" + (i + 1) + "] da coluna [" + (j + 1) + "]: ");   
                mat[i][j] = input.nextInt();   
                System.out.println("");   
            }   
        }  
	}
		
	public void exibirMatriz(){
			
		for (int i = 0; i < m; i++) {   
	           for (int j = 0; j < n; j++) {   
	            System.out.print(mat[i][j] + "   ");   
	            }   
	            System.out.println("\n");   
	        }   
		}
	
	public double[][] somar(double[][] matrizParaSomar){
		
		double[][] novaMatriz = new double[m][n];
		for (int i = 0; i < m; i++) {   
	           for (int j = 0; j < n; j++) { 
		
	novaMatriz[i][j] = mat[i][j] + matrizParaSomar[i][j];
	
	
	           }
		}
		return novaMatriz;
	}

Como poderia ser feita a chamada do método somar() para imprimir o resultado da soma de 2 matrizes ??

Abraços…

Provavelmente no seu método main.

Hmm, ao invés de:public double[][] somar(double[][] matrizParaSomar){ Usepublic Matriz somar(Matriz matrizParaSomar){ Embora dentro do método fique um pouquinho mais chato o código, fora dele vai ficar bem melhor, mais simples e mais fácil de usar.

victorwss, minha classe main ficou dessa forma!

Como poderei fazer a chamada do método somar() aqui??

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		int m;
		int n;
		int x;
		double[][] novaMatriz;
		Scanner input = new Scanner(System.in);
		
		
		
		System.out.println("Informe a operação que será realizada\n\n1 - soma de 2 matrizes\n2 - subtração de 2 matrizes\n3 - multiplicação de 2 matrizes\n4 - determina a tranposta de 1 matriz\n5 - sair\n\n");
		x = input.nextInt();
		
		
		
		if (x == 5){
			System.exit(0);
		}
		
		else if (x == 4){		
		System.out.println("Digite o número de linhas da Matriz: ");
		 m = input.nextInt();
		 
		System.out.println("Digite o número de colunas da Matriz: ");
		n = input.nextInt();
		
		}
		
		else if (x == 1 || x == 2){
			System.out.println("Digite o número de linhas das Matrizes: ");
			 m = input.nextInt();
			 
			System.out.println("Digite o número de colunas das Matrizes: ");
			n = input.nextInt();
			
			System.out.println("Digite os elementos da 1ª matriz: ");
			
			Matriz matriz1 = new Matriz( m, n);
			matriz1.lerMatriz();
			matriz1.exibirMatriz();
			
			System.out.println("Digite os elementos da 2ª matriz: ");
									 
						
			
			
			
		}
		
		else if (x == 3 ){
			System.out.println("Digite o número de linhas da 1ª Matriz: ");
			 m = input.nextInt();
			 
			System.out.println("Digite o número de colunas da 1ª Matriz: ");
			n = input.nextInt();
			
			Matriz matriz1 = new Matriz( m, n);
			matriz1.lerMatriz();
			matriz1.exibirMatriz();
						
			 System.out.println("Digite o número de linhas da 2ª Matriz: ");
			 m = input.nextInt();
			 
			 System.out.println("Digite o número de colunas da 2ª Matriz: ");
			 n = input.nextInt(); 
			 
			 }		
	}
}

Se você mudar o retorno e o parâmeto do método somar como eu lhe disse, vai ficar assim:

Matriz m1 = new Matriz(m, n); m1.lerMatriz(); Matriz m2 = new Matriz(m, n); m2.lerMatriz(); Matriz m3 = m1.somar(m2);
Se você trabalhar um pouco o código - transformando o método lerMatriz em um método estático que cria uma Matriz - seu código ficaria ainda melhor:

Matriz m1 = Matriz.lerMatriz(m, n); Matriz m2 = Matriz.lerMatriz(m, n); Matriz m3 = m1.somar(m2);

EDIT: Depois, que matar o negócio do cálculo das matrizes, troque a sua classe main “linguição” por uma telinha swing. Você vai aprender bastante fazendo isso.

victorwss, quando vc fala em transformar o método lerMatriz em um método estático que cria uma Matriz, não entendo como poderia ser feito isso!!

public Matriz somar(Matriz matrizParaSomar){   
		
		??????????????????????????????	
	
	           }

Abraços…

[code]public Matriz somar(Matriz matrizParaSomar){
Matriz novaMatriz = new Matriz(m, n);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
novaMatriz.mat[i][j] = this.mat[i][j] + matrizParaSomar.mat[i][j];
}
}
return novaMatriz;
}

public static Matriz lerMatriz(int m, int n) {
Matriz matriz = new Matriz(m, n);
matriz.lerMatriz();
return matriz;
}[/code] Viu, simples! Não precisou mudar quase nada no código e ele já fica muito mais fácil de usar. :smiley:

Poxa victorwss com esse método estático ficou muito mais fácil mesmo!
Vlw amigo
Obrigado

Abraços…

Ahh, ainda tenho que escrever o método multiplicar(), tenho que respeitar aquelas restrições de multiplicação que fala que para multiplicar 2 matrizes o número de colunas da primeira deve necessariamente ser igual o número de linhas da segunda!!

Vc poderia me passar dicas de implementação deste método ?

Abraços…

Mec?ico, já que você ficou empolgado com o estudo de matrizes, dá uma olhada nesse tópico:
http://www.guj.com.br/posts/list/15/85824.java
Mais precisamente na classe MatrizUtils do Dieval Guizelini. Leia-a com bastante atenção, que você vai gostar e aprender bem. :smiley:

[quote=Mec?ico]Poxa victorwss com esse método estático ficou muito mais fácil mesmo!
Vlw amigo
Obrigado

Abraços…

Ahh, ainda tenho que escrever o método multiplicar(), tenho que respeitar aquelas restrições de multiplicação que fala que para multiplicar 2 matrizes o número de colunas da primeira deve necessariamente ser igual o número de linhas da segunda!!

Vc poderia me passar dicas de implementação deste método ?

Abraços…[/quote]

Vou dar as dicas no método somar. Daí você acha as do multiplicar facinho.
No começo do método somar, coloque isso:if (this.m != matrizParaSomar.m) { throw new IllegalArgumentException("O número de linhas das duas matrizes deve ser igual."); } if (this.n != matrizParaSomar.n) { throw new IllegalArgumentException("O número de colunas das duas matrizes deve ser igual."); }Com isso você consegue fazer a restrição do método multiplicar facilmente.
Uma dica: Mude o nome dos atributos m e n para qtdLinhas e qtdColunas, para ficar mais fácil entender o código.
Quanto ao IllegalArgumentException, você o lança sempre que o seu método receber um conjunto de parâmetros inválidos. Por exemplo, se o construtor da matriz for chamado com o tamanho da matriz negativo, seria bom você lançar isso.
Por fim, bem vindo ao tratamento de exceções. Não se esqueça de dar uma estudada no try-catch, para saber como capturar e tratar os erros.

Vlw victorwss , mas olha sóh, pq não tah compilando ?

import java.util.Scanner;

public class Matriz {
	private double mat[][];
	private int m;
	private int n;
			
	public Matriz (int l, int c){
		m = l;
		n = c;
		mat = new double [m][n];
	}
	
	public static Matriz lerMatriz(int m, int n) {   
	    Matriz matriz = new Matriz(m, n);   
	    matriz.lerMatriz();   
	    return matriz;   
	}  
	
	public void lerMatriz(){
		Scanner input = new Scanner(System.in);
		
		for (int i = 0; i < m; i++) {   
            for (int j = 0; j < n; j++) {   
                System.out.println("Digite o elemento da linha [" + (i + 1) + "] da coluna [" + (j + 1) + "]: ");   
                mat[i][j] = input.nextInt();   
                System.out.println("");   
            }   
        }  
	}
		
	public void exibirMatriz(){
			
		for (int i = 0; i < m; i++) {   
	           for (int j = 0; j < n; j++) {   
	            System.out.print(mat[i][j] + "   ");   
	            }   
	            System.out.println("\n");   
	        }   
		}
	
	public Matriz somar(Matriz matrizParaSomar){   
	
	Matriz novaMatriz = new Matriz[m][n];             // Aqui dá o seguinte erro: type mismatch:
	           for (int i = 0; i < m; i++) {                  //cannot convert from Matriz[][] to Matriz
	           for (int j = 0; j < n; j++) { 
	
	        novaMatriz.mat[i][j] = this.mat[i][j] + matrizParaSomar.mat[i][j]; 
	
	        }
		}
		
		return novaMatriz;
	}
	
/*	public void somarEAtribuir(){
		

			
	}
	
	public Matriz subtrair(){
		
		
		
	}
	
	public void subtrairEAtribuir(){
		
	
		
	}
	
	public Matriz multiplicar(){
		
	
		
	}
	
	public void copiar(){
		
	
		
	}
	
	public Matriz obterTransposta(){
		
	
		
	}
	
	*/
}


Não é new Matriz[m][n] e sim new Matriz(m, n).

Vlw[b]victorwss[\b], Obrigado mesmo
Agora compilo

Abraços…

Tem outras sugestões para este código ? , apesar de ainda não estar pronto, sugestões para facilitar a leitura serão muito bem vindas!!

Segue a Classe Main que irá realizar as tarefas desse programa. SUGESTÕES…

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		int m;
		int n;
		int x;
		
		Scanner input = new Scanner(System.in);
						
		System.out.println("Informe a operação que será realizada\n\n1 - soma de 2 matrizes\n2 - subtração de 2 matrizes\n3 - multiplicação de 2 matrizes\n4 - determina a tranposta de 1 matriz\n5 - sair\n\n");
		x = input.nextInt();
		
				
		if (x == 5){
			System.exit(0);
		}
		
		else if (x == 4){		
		System.out.println("Digite o número de linhas da Matriz: ");
		 m = input.nextInt();
		 
		System.out.println("Digite o número de colunas da Matriz: ");
		n = input.nextInt();
		
		Matriz matriz1 = new Matriz( m, n);
		matriz1.lerMatriz();
		//matriz1.exibirMatriz();
		}
		
		else if (x == 1 || x == 2){
			System.out.println("Digite o número de linhas das Matrizes: ");
			 m = input.nextInt();
			 
			System.out.println("Digite o número de colunas das Matrizes: ");
			n = input.nextInt();
			
			System.out.println("Digite os elementos da 1ª matriz: ");
			
			Matriz matriz1 = new Matriz( m, n);
			matriz1.lerMatriz();
			matriz1.exibirMatriz();
			
			System.out.println("Digite os elementos da 2ª matriz: ");
									 
			//Matriz matriz2 = new Matriz( m, n);
			//matriz2.lerMatriz();
			//matriz2.exibirMatriz();
			
			
			
			
		}
		
		else if (x == 3 ){
			System.out.println("Digite o número de linhas da 1ª Matriz: ");
			 m = input.nextInt();
			 
			System.out.println("Digite o número de colunas da 1ª Matriz: ");
			n = input.nextInt();
			
			Matriz matriz1 = new Matriz( m, n);
			matriz1.lerMatriz();
			matriz1.exibirMatriz();
						
			 System.out.println("Digite o número de linhas da 2ª Matriz: ");
			 m = input.nextInt();
			 
			 System.out.println("Digite o número de colunas da 2ª Matriz: ");
			 n = input.nextInt(); 
			 
			 //Matriz matriz2 = new Matriz( m, n);
			 //matriz2.lerMatriz();
			 //matriz2.exibirMatriz();
		}		
	}
}


Abraços…

Pega o conteúdo de cada if e separa cada um em um método a parte. Assim o seu método main fica mais limpo e cada operação fica independente do main.
Tente evitar códigos repetidos. Em vez de repetir códigos, crie métodos a parte que façam o trabalho que iria se repetir e chame esse método de todos os lugares necessários. Assim, se precisar mexer neste código, você só mexe em um lugar. Além disso, o código fica menor e mais simples. É extamente isso que está por trás daquele public static Matriz lerMatriz(int m, int n). O trabalho repetitivo (criar a matriz e ler os valores em seguida) foi isolado em um método a parte.

victorwss , pensei em fazer isso, mas veja que cada pergunta muda em cada if (nem que seja a palavra indo para o plural)!!

Daí acho que nem tem como utilizar métodos para chamar essas “Perguntas ao usuário”

Vc tem alguma sugestão, pois não consigo enxergar outra saída.

Abraços…

Vlw pelas sugestões victorwss

victorwss, o método somarEAtribuir() deverá somar duas matrizes (o objeto utilizado na chamada do método e o objeto passado como parâmetro) e o resultado deverá ser armazenado no objeto utilizado na chamada do método.

Não entendi isso !! como poderei fazer isso, vc poderia me esclarecer passando o código se necessário também !

Abraços…

[code]
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int x;

	Scanner input = new Scanner(System.in);
					
	System.out.println("Informe a operação que será realizada\n\n1 - soma de 2 matrizes\n2 - subtração de 2 matrizes\n3 - multiplicação de 2 matrizes\n4 - determina a tranposta de 1 matriz\n5 - sair\n\n");
	x = input.nextInt();
	
			
	if (x == 5){
		System.exit(0);
	} else if (x == 4){		
	    transposta();
	} else if (x == 1) {
	    soma();
	} else if (x == 2) {
	    subtracao();
	} else if (x == 3) {
	    multiplicacao();
	}
}

private static void soma() {
	...
}

private static void subtracao() {
	...
}

private static void multiplicacao() {
	...
}

private static void transposta() {
	...
}

private static Matriz lerMatrizDoUsuario(int num) {
	System.out.println("Digite o número de linhas da " + num + "ª Matriz: ");
	int m = input.nextInt();

	System.out.println("Digite o número de colunas da " + num + "ª Matriz: ");
	int n = input.nextInt();

	return Matriz.lerMatriz(m, n);
}

}[/code]

O somarEAtribuir() é quase igual ao somar. Só tem 3 diferenças:

  1. Ele não cria uma nova matriz.
  2. Ele soma os valores em si próprio. (dica, use o operador +=)
  3. Ele retorna this.

victorwss , como vc conseguiu chamar o método somar() da classe Matriz a partir da classe Main para rodar o programa??

Abraços…

victorwss , [i]quando chamei o método somar() da Classe Matriz a partir da Classe Main deu erro na Compilação ?

Você conseguiu ?

Abraços…

Mostre o erro de compilação.

Aí está o erro de compilação !

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		int m;
		int n;
		int x;
		
		Scanner input = new Scanner(System.in);
						
		System.out.println("Informe a operação que será realizada\n\n1 - soma de 2 matrizes\n2 - subtração de 2 matrizes\n3 - multiplicação de 2 matrizes\n4 - determina a tranposta de 1 matriz\n5 - sair\n\n");
		x = input.nextInt();
		
		if (x == 5){   
            System.exit(0);   
        } else if (x == 4){       
            transposta();   
        } else if (x == 1) {   
            soma();   
        } else if (x == 2) {   
            subtracao();   
        } else if (x == 3) {   
            multiplicacao();   
        }   
    }   
  
    private static void soma() {
    	Matriz matriz = new Matriz(m,n);                                //Erro de compilaçao aqui !
    	matriz.somar(matrizParaSomar);                                   
    	matriz.exibirMatriz();
    	               
    }   
  
    private static void subtracao() {   
           
    }   
  
    private static void multiplicacao() {   
           
    }   
  
    private static void transposta() {   
           
    }   
  
    private static Matriz lerMatrizDoUsuario(int num) {   
    	
    	Scanner input = new Scanner(System.in);
    	
        System.out.println("Digite o número de linhas da " + num + "ª Matriz: ");   
        int m = input.nextInt();   
  
        System.out.println("Digite o número de colunas da " + num + "ª Matriz: ");   
        int n = input.nextInt();   
  
        return Matriz.lerMatriz(m, n);   
    }   
}  

Abraços…