Valores da matriz diagonal

eu pretendo desenvolver um excerto de codigo que devolva os valores, que esteja na diagonal do array, ou seja quando o i tambem é igual ao j, eu experientei e esbarrei num ponto. ora vejam:

[code]int[][] diagonal(int[][] matriz){

boolean verdade = false;

for(int i=0;i<matriz.length;i++){
	for(int j=0;j<matriz.length;j++){
		if(i==j)
	matriz[i][j] = ;


return matriz;

}
}
}[/code]

obrigado

Seria algo assim:

[code]public class TestaExcessoes {
int[]diagonal(int[][] matriz) {
int vetorDiagonal[] = new int[matriz.length];
for (int i = 0; i < matriz.length; i++) {
for (int j = 0; j < matriz[i].length; j++) {
if (i == j)
vetorDiagonal[i] = matriz[i][j];

		}
	}
	return vetorDiagonal;
}[/code]

Se é a diagonal principal, então é quando i==j.

Portanto, basta 1 for, e nem precisa do if:

public class TestaExcessoes { int[] diagonal(int[][] matriz) { int[] vetorDiagonal = new int[matriz.length]; for (int i = 0; i &lt; matriz.length; i++) { vetorDiagonal[i] = matriz[i][i]; } return vetorDiagonal; } }

Errando que se aprende né, hehehe.

Se você colocasse um contador para o índice do vetor diagonal também funcionaria:

public class TestaExcessoes { int[]diagonal(int[][] matriz) { int cont = 0; int vetorDiagonal[] = new int[matriz.length]; for (int i = 0; i &lt; matriz.length; i++) { for (int j = 0; j &lt; matriz[i].length; j++) { if (i == j) vetorDiagonal[cont++] = matriz[i][j]; } } return vetorDiagonal; }

Mas é terrívelmente ineficiente. Com uma matriz 10x10 esse código percorreria 100 elementos, contra apenas 10 do outro.

Obrigado pela correção, realmente muito bacana, estou revendo agora os códigos usando vetores em função do estudo para certificação, e vejo que realmente
temos muito que aprender com o “básico”, Quando tiver em uma sala de aula lecionando(Sonho ainda), espero renomear java básico para:

“Java Essencial”

Vai ser melhor renomear para “Java Essencial”, hehhhehe, mas entendi seu ponto de vista.

Na Pós Graduação eu aprendi a passar o corretor ortográfico ou pesquisar no dicionário antes de escrever palavras com grafia…

Vou aplicar essa estratégia no próximo post.

Heehhe, mas que foi uma piada foi não é verdade, ainda mais eu que já tirei onda em vários posts com erros de português…

[quote=ViniGodoy]Se é a diagonal principal, então é quando i==j.

Portanto, basta 1 for, e nem precisa do if:

public class TestaExcessoes { int[] diagonal(int[][] matriz) { int[] vetorDiagonal = new int[matriz.length]; for (int i = 0; i &lt; matriz.length; i++) { vetorDiagonal[i] = matriz[i][i]; } return vetorDiagonal; } }[/quote]

apesar q isso ta considerando q matriz é sempre uma matriz quadrada.

se vc passar uma matriz[10][5] teria prob de “index inválido”

Até onde eu sei para se obter uma diagonal principal de uma matriz ela deve ser quadrada.

Bom, não achei nunca alguém calculando diagonal de matriz que não seja quadrada.

Exatamente. Só ressaltei isso pq o código não testa explicitamente essa condição. Se não for quadrada, ele pode ou dar pau (se m for menor que n) ou então, calcular um número qualquer (que seria a diagonal de um quadrado nxn).

Exatamente. Só ressaltei isso pq o código não testa explicitamente essa condição. Se não for quadrada, ele pode ou dar pau (se m for menor que n) ou então, calcular um número qualquer (que seria a diagonal de um quadrado nxn).[/quote]

sim sim, esse passo ja eu o fiz, pois nao tinha nexa nenhum saber qual e a diagonal se a matriz nao fosse quadrada.

muito obrigado pelas dicas

Aproveitando o gancho para perguntar, lançar uma exception neste caso é incorreto?, deveria usar if mesmo, e colocar um argumento boolean ou algo do tipo no código abaixo?
Ja li vários artigos sobre exceptions checked unchecked, e ainda não entendi muito bem o que é ou não abuso.

[code]package exemplos;

import javax.swing.JOptionPane;

public class TestaExcessoes {

public static void main(String[] args) {
    int [][]matriz = { {0, 0, 0}, {0, 0, 0,0}, {0, 0, 0} };  
    try {
    	diagonal(matriz);
	} catch (IllegalArgumentException e) {
		JOptionPane.showMessageDialog(null, e.getMessage());
	}
    
}
static int[]diagonal(int[][] matriz) {  
    int vetorDiagonal[] = new int[matriz.length];  
    for (int i = 0; i &lt; matriz.length; i++) {  
    	if(matriz[i].length != matriz.length){
    		throw new IllegalArgumentException(&quot;A matriz deveria ter dimensões &quot;+matriz.length+
    				&quot;X&quot;+matriz.length+
    				&quot; ou &quot;+ matriz[i].length+&quot;X&quot;+matriz[i].length+ 
    				&quot; dimensão inválida para coluna=&quot;+matriz[i].length);
    	}
    	vetorDiagonal[i] = matriz[i][i];
    }
    return vetorDiagonal;  
}  

}[/code]

Existem algumas opções:

  1. Disparar uma exceção não verificada (pode ser a IllegalArgumentException): Para sistemas comerciais, essa é geralmente a maneira correta de proceder.
  2. Retornar uma matriz vazia: Indicando que não há diagonal principal;
  3. Em sistemas de performance crítica, pode-se usar uma asserção. Asserções verificam valores de entrada e disparam exceções apenas se forem explicitamente ligadas, portanto, são desligadas durante a execução do programa em produção (no caso específico de matrizes em um motor gráfico, isso é praticamente obrigatório. Alguns testes, como testar se o determinante é 0 antes de tentar inverter uma matriz podem ser extremamente caros).

[quote=ViniGodoy]Se é a diagonal principal, então é quando i==j.

Portanto, basta 1 for, e nem precisa do if:

public class TestaExcessoes { int[] diagonal(int[][] matriz) { int[] vetorDiagonal = new int[matriz.length]; for (int i = 0; i &lt; matriz.length; i++) { vetorDiagonal[i] = matriz[i][i]; } return vetorDiagonal; } }[/quote]

Eu tenho uma questão, com este codigo acima eu passo a devolver a diagonal da matriz sob a forma
de um vector de inteiros?

[quote=andrefilipe6]Eu tenho uma questão, com este codigo acima eu passo a devolver a diagonal da matriz sob a forma
de um vector de inteiros?[/quote]

É exatamente isso que ele faz. Retorna um vetor de inteiros.

Se quiser usar a classe Vector, o ideal é abandonar a idéia e usar ArrayList no lugar:

public class TestaExcessoes {
    List&lt;Integer&gt; diagonal(int[][] matriz) {
        List&lt;Integer&gt; vetorDiagonal = new ArrayList&lt;&gt;();
        for (int i = 0; i &lt; matriz.length; i++) {	    
            vetorDiagonal.add(matriz[i][i]);
        }
        return vetorDiagonal;
    }
}

Muito boa explicação Vini.

[quote=ribclauport]Muito boa explicação Vini.
[/quote]

apesar q, já q se sabe o tamanho, poderia até usar vetor int[].

[code]public class TestaExcessoes {
int[] diagonal(int[][] matriz) {
int[] vetorDiagonal = new int[matriz.length];

    for (int i = 0; i &lt; matriz.length; i++) {          
        vetorDiagonal[i] = matriz[i][i];  
    }  
    return vetorDiagonal;  
}  

} [/code]

Exatamente, essa foi a minha primeira sugestão.

Exatamente, essa foi a minha primeira sugestão.
[/quote]

SIm e corre as mil maravilhas de uma forma bastante eficiente.

Agora uma duvida de curiosidade, imaginemos que eu queria devolver a matriz diagonal de uma matriz quadrada dada, mas que nesta matriz a devolver apenas quero que apareça os valores da diagonal ou seja nas posiçoes em que i!=j apareceria 0 e nas posiçoes em que j=i apareceria entao os valores na diagonal da matriz fornecida ora observem o que eu fiz:

int[][] diagonal(int[][] matriz){
	
	

	int[][] vetorDiagonal;  
    for (int i = 0; i &lt; matriz.length; i++){          
        for(int j = 0; j&lt; matriz.length; j++){ 
    	if(i!=j)
    	vetorDiagonal[i][j] = 0;
    else
    	vetorDiagonal[i][j] = matriz[i][i];
    }
    }
    return vetorDiagonal;  
}