Hallo, für einen Beleg muss ich den Rang einer Matrix berechnen.
Im Moment ist es so:
(m == n) Das Ergebnis ist falsch
(m > n) Gibt einen Absturz in [JAVA=8]public static int getMaxWertVonMatrixInSpalte(Matrix m1, int k){...}[/code] weil k > n wird und es kommt ein "java.lang.ArrayIndexOutOfBoundsException"
(m < n) Das Ergebnis ist falsch
Wenn ich es so mache:
[JAVA=12]wert = abs(m1.matrix[k][0]);[/code]
[JAVA=16]betrag = abs(m1.matrix[0]);[/code]
Dann kommen Abstürze bzw. auch Falsche Ergebnisse.
Bin mit meinem am Latein am Ende!
Im Moment ist es so:
(m == n) Das Ergebnis ist falsch
(m > n) Gibt einen Absturz in [JAVA=8]public static int getMaxWertVonMatrixInSpalte(Matrix m1, int k){...}[/code] weil k > n wird und es kommt ein "java.lang.ArrayIndexOutOfBoundsException"
(m < n) Das Ergebnis ist falsch
Wenn ich es so mache:
[JAVA=12]wert = abs(m1.matrix[k][0]);[/code]
[JAVA=16]betrag = abs(m1.matrix[0]);[/code]
Dann kommen Abstürze bzw. auch Falsche Ergebnisse.
Bin mit meinem am Latein am Ende!
Java:
public static void tauschen(Matrix m1, int x, int y)
{
double[] temp = m1.matrix[x];
m1.matrix[x] = m1.matrix[y];
m1.matrix[y] = temp;
}
// int k = 0;
public static int getMaxWertVonMatrixInSpalte(Matrix m1, int k) {
double wert, betrag;
int maxWert = 0;
wert = abs(m1.matrix[0][k]);
for (int i=k; i<m1.getZeile(); i++) {
betrag = abs(m1.matrix[i][k]);
if (wert <= betrag) {
wert = betrag;
maxWert = i;
}
}
return maxWert;
}
public Matrix getGauss () {
/*
for k = 1 ... m:
Find pivot for column k:
i_max := argmax (i = k ... m, abs(A[i, k]))
if A[i_max, k] = 0
error "Matrix is singular!"
swap rows(k, i_max)
Do for all rows below pivot:
for i = k + 1 ... m:
Do for all remaining elements in current row:
for j = k ... n:
A[i, j] := A[i, j] - A[k, j] * (A[i, k] / A[k, k])
Fill lower triangular matrix with zeros:
A[i, k] := 0
*/
Matrix ergebnisMatrix = this;
int iMax;
System.out.println();
for (int k=1; k<getZeile(); k++) {
iMax = getMaxWertVonMatrixInSpalte(ergebnisMatrix, k);
System.out.println("k=" + k + " iMax=" + iMax);
if (ergebnisMatrix.matrix[iMax][k] == 0.0) {
throw new UnsupportedOperationException();
}
tauschen(ergebnisMatrix, k, iMax);
// Irgendwo ein Fehler!?
for (int i=(k+1); i<ergebnisMatrix.getZeile(); i++) {
for (int j=k; j<ergebnisMatrix.getSpalte(); j++) {
ergebnisMatrix.matrix[i][j] -= ergebnisMatrix.matrix[k][j] * (ergebnisMatrix.matrix[i][k] / ergebnisMatrix.matrix[k][k]);
}
ergebnisMatrix.matrix[i][k] = 0.0;
}
System.out.println(ergebnisMatrix);
}
return ergebnisMatrix;
}
public int getRang() {
Matrix gauss = this.getGauss();
int rang = 0;
boolean alleNull;
for (int j = 0; j < gauss.getSpalte(); j++) {
alleNull = true;
for (int i = 0; i < gauss.getZeile(); i++) {
if (gauss.matrix[i][j] != 0.0) {
alleNull = false;
}
}
if (!alleNull) {
++rang;
}
}
return rang;
}