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
[code]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;
}[/code]
Quando altero o matriz.length e o matriz[0].length por ordem, ele da java.lang.ArrayIndexOutOfBoundsException:.
[code]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;[/code]
Não consigo entender o por que, se alguém puder me ajudar eu agradeço.
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();
}
}
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.
[quote=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.[/quote]
estranho!
mais para tirar a duvida faz um teste ai coloca isso no inicio do método determinant:
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.
[code]# result += matriz[0][i] * Math.pow(-1, (double) i)
* determinant(temp, ordem); [/code]
para
[code]# result += matriz[0][i] * Math.pow(-1, (double) i)