Ajuda, matriz transposta

to tentando fazer o método da matriz transposta porem não estou achando pq esta dando IndexOutOfBounds, pra mim a lógica do for ta certa.
sera q a implementação ta errada?

//- Implementar um método que calcule a matriz transposta de uma matriz dada:
	public int[][] matrizTransposta(int[][] matriz){
		for(int linha=0;linha<matriz.length;linha++){
			for(int coluna=0;coluna<matriz[linha].length;coluna++){
				if(coluna>linha)
					matriz[linha][coluna]=matriz[coluna][linha];
			}
		}
		return matriz;
		  
	} 

tambem gostaria de saber como declarar uma matriz bidimensional como uma string…

obrigado,
aguardo.

1 curtida

Fala Pedro, vou responder a sua pergunta 2 e depois ler para ver se sei a pergunta 1 (sobre o código), ok? Você pediu matriz bidimensional “como String”… se você quis dizer “matriz bidimensional de Strings”, a resposta é a que segue, senão poderia ser mais específico? Não compreendi.

Matriz bidimensional de Strings:

String[][] matriz = new String[10][];

ou String[][] matriz = null;

E depois você preenche a matriz ou define o tamanho. Você só é obrigado a definir o tamanho da primeira matriz. Por quê?

Rápido adendo:
Porque assim você tem espaço para dez matrizes de Strings. Daí você vai alocar o espaço de cada matriz individualmente depois.

Se ficou confuso com o adendo, desconsidere-o :wink:

Cara, tb nao vi problema. Pq nao tentar fazer um debug na classe? Com o debug vc vai executando linha a linha.
Pega uma IDE(eclipse por exemplo). Ai é so vc clicar na margem esquerda, exatamente na linha que vc quer começar o debug, ai é so executar a classe e quando chegar na linha marcada, vc ira executar e ver o codigo sendo executado ao mesmo tempo.

Falow

Por que acontece arrayOutOfBounds?

Se você rodar seu programa com uma matriz de 4 linhas por 3 colunas, não haverá problema, assim como matrizes quadradas.

Agora, se houver um número maior de colunas do que de linhas, dará estouro no array.

Você etm uma matriz[2][3]. A transposta dela tem que ser montada numa matriz [3][2]. Me corrija se estiver errado, mas você deveria montar uma matriz nova antes de retornar o método. Vou fazer um novo método e enviar, se alguém tiver outra solução ;).

Abraços.

humm vlw ai
verdadi o problema era mesmo com este tipo de matriz…
no teste no papel fiz pra uma matriz quadrada e a que eu estava testando no programa era uma de 3 linhas por 4 colunas…

soh q to errando ou faltando alguma coisa ainda na classe da interface, não esta aparecendo os numeros e sim uns códigos estranho
[[I@422ede

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

                             MatrizPedro execute=new MatrizPedro();
                              int[][] matriz={ {4,6,2},{12,9,3}, {10,2,3} };

                              System.out.println("A matriz original era a: " + matriz );
                              System.out.println("A matriz transposta eh a: " + execute.matrizTransposta(matriz) );

	
	}
}

o println ta errado?? tentei fazer: System.out.printf("… %f",execute.matrizTransposta(matriz) ); tb não deu certo e nem o System.out.printf("… %d",execute.matrizTransposta(matriz) );

ii acho q oq flei atras era bobagem… acho q vi um erro no codigo, eu posso mudar daquele jeito uma matriz q acabei de receber?? não teria que criar uma outra matriz e nela ir jogando os numeros na ordem certa??
olha como to pensando que é:

	//- Implementar um método que calcule a matriz transposta de uma matriz dada:
	public int[][] matrizTransposta(int[][] matriz){
		
		int[][] transposta=new int[matriz[0].length][matriz.length];;
		for(int linha=0;linha<matriz.length;linha++){
			for(int coluna=0;coluna<matriz[linha].length;coluna++){
				if(coluna>linha)
					matriz[linha][coluna]=transposta[coluna][linha];
				if(coluna==linha)
					matriz[linha][coluna]=transposta[linha][coluna];
					
			}
		}
		return transposta;

ainda tem alguma coisa que ta errada, acabei de muda pra ve, vo começa tudo de novo pra faze com calma…

agora acho que terminei…
só que nao consigo faze ainda o print

	//- Implementar um método que calcule a matriz transposta de uma matriz dada:
	public int[][] matrizTransposta(int[][] matriz){
		
		int[][] transposta=new int[matriz[0].length][matriz.length];;
		for(int linha=0;linha<matriz.length;linha++){
			for(int coluna=0;coluna<matriz[linha].length;coluna++){
				if(coluna>linha)
					matriz[linha][coluna]=transposta[coluna][linha];
				else if(coluna==linha)
						matriz[linha][coluna]=transposta[linha][coluna];
					else
						matriz[linha][coluna]=transposta[coluna][linha];
					
			}
		}
		return transposta;

Um int é um tipo primitivo, um int[][] é um Objeto. Confuso? Isso cai na prova de SCJP. Por isso quando você manda imprimir sair algo estranho, é o endereço do objeto na memória que você está mandando imprimir. Para testar, pode fazer Object o = new Object(); e depois imprimir o objeto o. A saída será um código no mesmo formato.

O que você precisa implementar é um for dentro de outro for ;). Moleza se você implementou a opção de transpor a matriz.

Abraços.

O post é antigo, mas alguém pode precisar, então tá aí:

import java.util.Arrays;

import javax.swing.JOptionPane;



public class MatrizTransposta {

	public static void main(String[] args) {
		
		int m[][] = {{1,2,3},{4,5,6},{7,8,9}};
		
		int[][] transposta=new int[m[0].length][m.length];;
		
		System.out.println("MATRIZ NORMAL ");
		for(int i=0; i<m.length; i++)
		{
			for(int j=0; j<m[i].length; j++)
			{
				System.out.print(m[i][j]+"\t");
			}
			System.out.println();
		}
		
		for(int linha=0;linha<m.length;linha++){  
	        for(int coluna=0;coluna<m[linha].length;coluna++){  
	            if(coluna > linha || coluna < linha)  
	            	transposta[linha][coluna]=m[coluna][linha];  
	            if(coluna==linha)  
	            	transposta[linha][coluna]=m[linha][coluna];  
	                  
	        }  
	    } 
		
		System.out.println();
		System.out.println("MATRIZ TRANSPOSTA ");
		for(int i=0; i<transposta.length; i++)
		{
			for(int j=0; j<transposta[i].length; j++)
			{
				System.out.print(transposta[i][j]+"\t");
			}
			System.out.println();
		}
		

	}
}

Matriz transposta com Scanner

Segue abaixo um código para fazer uma matriz transposta: `

public static void main(String[] args) {
	// Esse programa lê uma matriz bidimensional e transforma em um
	// transposta
	Scanner pergunta = new Scanner(System.in);
	int n = 3;
	int[][] matriz = new int[n][n];
	int[][] matrizT = new int[n][n];
	System.out.println("Matriz M[3][3]\n");

	for (int linha = 0; linha < n; linha++) {
		for (int coluna = 0; coluna < n; coluna++) {
			System.out.printf("Insira o elemento M[%d][%d]: ", linha + 1, coluna + 1);
			matriz[linha][coluna] = pergunta.nextInt();
		}
	}

	System.out.println("\nA Matriz original ficou: \n");
	for (int linha = 0; linha < n; linha++) {
		for (int coluna = 0; coluna < n; coluna++) {
			System.out.printf("\tM[%d][%d]: ", linha + 1, coluna + 1);
			System.out.printf("%d \t", matriz[linha][coluna]);
		}
		System.out.println();
	}
	for (int linha = 0; linha < n; linha++) {
		for (int coluna = 0; coluna < n; coluna++) {
			matrizT[linha][coluna] = matriz[coluna][linha];
		}
	}
	System.out.println("\n Matriz transposta: \n");
	for (int linha = 0; linha < n; linha++) {
		for (int coluna = 0; coluna < n; coluna++) {
			System.out.printf("\tM[%d][%d]: ", linha + 1, coluna + 1);
			System.out.printf("%d \t", matrizT[linha][coluna]);
		}
		System.out.println();
	}
}

}`

Matriz transposta SEM scanner, XD.

package crisis;
import java.util.Arrays;

public class Crisis {

public static void main(String[] args) {
    int[][] matriz = {{1,2,3,4},{5,6,7,8}};
    for (int[] normal : matriz) {
        System.out.println(Arrays.toString(normal));
    }
    System.out.println();
    for (int[] transposta : matrizTansposta(matriz)) {
        System.out.println(Arrays.toString(transposta));
    }        
}   

private static int[][] matrizTansposta(int[][] matriz) {
    int[][] retorno = new int[matriz[0].length][matriz.length];//invertendo a linha com a coluna
    for (int lin = 0; lin < retorno.length; lin++) {
        for (int col = 0; col < retorno[lin].length; col++) {
            retorno[lin][col] = matriz[col][lin];
        }
    }
    return retorno;
}

}