Methoden Rang von einer Matrix mit Gauss

__what__

Neues Mitglied
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!



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;
    }
 

Zurück
Oben