Problema com .length em matriz [resolvido]

6 respostas
Pinhorox

Bem, estou fazendo um exercício ao qual eu necessito fazer a determinante de uma matriz, seja ela 2x2 ou 99x99.
Fiz o algoritmo, porem o professor não quer me deixar usar o .length para achar o tamnho da matriz

public class Exercicio8 {
	// Encontrando a determinante
	public static double determinant(double[][] matriz) {
		double result = 0;

		if (matriz.length == 1) {
			result = matriz[0][0];
			return result;
		}

		if (matriz.length == 2) {
			result = matriz[0][0] * matriz[1][1] - matriz[0][1] * matriz[1][0];
			return result;
		}

		for (int i = 0; i < matriz[0].length; i++) {
			double temp[][] = new double[matriz.length - 1][matriz[0].length - 1];

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

					if (k < i) {
						temp[j - 1][k] = matriz[j][k];
					} else if (k > i) {
						temp[j - 1][k - 1] = matriz[j][k];
					}

				}
			}

			result += matriz[0][i] * Math.pow(-1, (double) i)
					* determinant(temp);
		}
		return result;
	}

Quando altero o matriz.length e o matriz[0].length por ordem, ele da java.lang.ArrayIndexOutOfBoundsException:.

public class Exercicio8 {
	// Encontrando a determinante
	public static double determinant(double[][] matriz, int ordem) {
		double result = 0;

		if (ordem == 1) {
			result = matriz[0][0];
			return result;
		}

		if (ordem == 2) {
			result = matriz[0][0] * matriz[1][1] - matriz[0][1] * matriz[1][0];
			return result;
		}

		for (int i = 0; i < ordem; i++) {
			double temp[][] = new double[ordem - 1][ordem - 1];

			for (int j = 1; j < ordem; j++) {
				for (int k = 0; k < ordem; k++) {

					if (k < i) {
						temp[j - 1][k] = matriz[j][k];
					} else if (k > i) {
						temp[j - 1][k - 1] = matriz[j][k];
					}

				}
			}

			result += matriz[0][i] * Math.pow(-1, (double) i)
					* determinant(temp, ordem);
		}
		return result;

Não consigo entender o por que, se alguém puder me ajudar eu agradeço.

6 Respostas

Adelar

Olá,
o problema ocorre porque matriz.length é para saber a quantidade de linhas, mas matriz[0].length é para colunas. A seguir tem um código de exemplo:

public class Test { public Test(){ double matriz[][] = new double[2][3]; System.out.println("matriz.length = "+matriz.length); System.out.println("matriz[0].length = "+matriz[0].length); } public static void main(String[] args) { new Test(); } }

Att.

InSeOfKn

me corrijam se eu estiver errado

você cria sua matriz antes para enviar como parâmetro né?

se sim, o usuário deve infonar a tamanho da matriz, eu acho?

se garanta que o valor enviado por parâmetro é o mesmo valor que o usuário informou para criar a matriz

se não for assim a aplicação posta todo o código (principalmente o que chama o método determinant)

até mais!

Pinhorox

Adelar, eu sei que o matriz.length é a linha e o matriz[0].length é a coluna, só que os dois são iguais(estou fazendo simplesmente com uma matriz quadrada) só que mesmo assim a ordem nao funciona, somente com o matriz.length e matriz [0].length.

InSeOfKn, Sim. O programa pergunta a ordem da matriz para o usuário, logo depois faz os for necessários para o usuário informar o número que ele quer para cada linhaXcoluna…
Os dois sao passados por parâmetro para o método que postei.

InSeOfKn

Pinhorox:


InSeOfKn, Sim. O programa pergunta a ordem da matriz para o usuário, logo depois faz os for necessários para o usuário informar o número que ele quer para cada linhaXcoluna…
Os dois sao passados por parâmetro para o método que postei.

estranho!
mais para tirar a duvida faz um teste ai coloca isso no inicio do método determinant:

System.out.println("matriz.length = "+matriz.length+" ordem = "+ordem+"matriz.length[0] = "+matriz.length[0]);

só para ter 100% de certeza que sai tudo igual, OK!

até!

Pinhorox

Obrigado InSeOfKn,
Com isso pude ver que na hora do determinant(temp, ordem) eles mostrou que estava entrando o valor original, soh que o tamanho da matriz diminuia 1, por isso explodia o array... com isso adicionei o -1 dps do ordem e funcionou. Obrigado.

#             result += matriz[0][i] * Math.pow(-1, (double) i)  
#                     * determinant(temp, ordem);

para

#             result += matriz[0][i] * Math.pow(-1, (double) i)  
#                     * determinant(temp, ordem-1);
InSeOfKn

Ok, estamos aqui para isso
qualquer duvida é só postar!

até

Criado 22 de outubro de 2010
Ultima resposta 22 de out. de 2010
Respostas 6
Participantes 3