Stránka 1 z 1

Java, zmatek v tridach a instanci atd..

Napsal: sob 2. kvě 2009, 22:19
od Gabbo
Ahoj,
mam dost zmatek v tech ruznych vychytavkach objektoveho programovani a momentalne jsem se v jednom projektu zabrzdil na jedne veci..

Kód: Vybrat vše

package maticeproject2009;

final public class Matrix {
    private final int M;             // number of rows
    private final int N;             // number of columns
    private final double[][] data;   // M-by-N array

    // create M-by-N matrix of 0's
    public Matrix(int M, int N) {
        this.M = M;
        this.N = N;
        data = new double[M][N];
    }

    // create matrix based on 2d array
    public Matrix(double[][] data) {
        M = data.length;
        N = data[0].length;
        this.data = new double[M][N];
        for (int i = 0; i < M; i++)
            for (int j = 0; j < N; j++)
                    this.data[i][j] = data[i][j];
    }

    // copy constructor
    private Matrix(Matrix A) { this(A.data); }

    // print matrix to standard output
    public void show() {
        for (int i = 0; i < M; i++) {
            for (int j = 0; j < N; j++)
                System.out.printf("%9.4f ", data[i][j]);
            System.out.println();
        }
    }
    
    public Matrix gaussian() {
        // create copies of the data
        Matrix A = new Matrix(this);

        // Gaussian elimination with partial pivoting
        for (int i = 0; i < N; i++) {

            // find pivot row and swap
            int max = i;
            for (int j = i + 1; j < N; j++)
                if (Math.abs(A.data[j][i]) > Math.abs(A.data[max][i]))
                    max = j;
            A.swap(i, max);

            // pivot within A
            for (int j = i + 1; j < N; j++) {
                double m = A.data[j][i] / A.data[i][i];
                for (int k = i+1; k < N; k++) {
                    A.data[j][k] -= A.data[i][k] * m;
                }
                A.data[j][i] = 0.0;
            }
        }
        return A;
    }

    // swap rows i and j
    private void swap(int i, int j) {
        double[] temp = data[i];
        data[i] = data[j];
        data[j] = temp;
    }

    // test client
    public static void main(String[] args) {
        double[][] d = { { 8, -1, -2, 0 }, { -1, 7, -1, 10 }, { -2, -1, 9, 23} };
        Matrix A = new Matrix(d);
        A.show();
        System.out.println();

        A.gaussian();
        System.out.println("Uprava na schodovy tvar:");
        A.show();
    }
}
Hazi mi to: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
takze tipuji, ze mam spatne inicializovaneou matici A v metode gaussian, jelikoz me to odkazuje na radek

Kód: Vybrat vše

if (Math.abs(A.data[j][i]) > Math.abs(A.data[max][i]))
Muzete mi pls poradit jak na to?

Re: Java, zmatek v tridach a instanci atd..

Napsal: ned 3. kvě 2009, 03:29
od xxsawer
:o :o :o
Co to je za silenost???
Krome toho hroznyho odsazovani, co to prosimte delas v tom konstruktoru?
// copy constructor
private Matrix(Matrix A) { this(A.data); }

????

Re: Java, zmatek v tridach a instanci atd..

Napsal: ned 3. kvě 2009, 09:01
od Gabbo
Zajimalo by me co ti vadi na tom odsazovani?
Jinak ten konstruktor vytvari kopii jiz existujici matice.. Tahla vec bez problemu funguje.. mam to odzkouseno na jinych metodach, ktere jsem tu nedaval abych ten kod zkratil..

Re: Java, zmatek v tridach a instanci atd..

Napsal: ned 3. kvě 2009, 10:25
od OndraSter
Gaussiana neznám, ale jen mě do oka bilo:

Kód: Vybrat vše

...
// find pivot row and swap
int max = i;
for (int j = i + 1; j < N; j++)
if (Math.abs(A.data[j][i]) > Math.abs(A.data[max][i]))
....
A na začátku máš

Kód: Vybrat vše

private final int M;             // number of rows
Nemá tam být M, místo N v tom FORu?

Je to jediné, co mě napadá, neboť ta chyba říká, že se dostaneš mimo pole - a nikde jinde mi nepřijde, že by to bylo špatně.

Ještě jsem vygooglil http://en.wikipedia.org/wiki/Gaussian_elimination a maj tam ten druhý do M:

Kód: Vybrat vše

while (i ≤ m and j ≤ n) do
  Find pivot in column j, starting in row i:
  maxi := i
  for k := i+1 to m do
    if abs(A[k,j]) > abs(A[maxi,j]) then
      maxi := k
    end if