Java, zmatek v tridach a instanci atd..

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
Gabbo
Nováček
Nováček
Registrován: 02. kvě 2009

Java, zmatek v tridach a instanci atd..

Příspěvek 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?
xxsawer
Začátečník
Začátečník
Registrován: 29. kvě 2007

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

Příspěvek 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); }

????
Gabbo
Nováček
Nováček
Registrován: 02. kvě 2009

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

Příspěvek 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..
OndraSter
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 22. úno 2006
Bydliště: Praha / ČVUT FIT
Kontaktovat uživatele:

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

Příspěvek 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
PC: i5-2500k 4.5GHz/24GB RAM/GTX560 Ti 1GB/>5TB - W7 Prof x64; Microsoft SideWinder X3 notebook: HP 6715b (4GB RAM) - W7 Prof x64;
mobil: Nokia Lumia 800 Cyan, 16GB; tablet: Toshiba Portege M200 (2GB, 64GB SSD, GeForce FX5200) - W7 Prof x32


Nahraďte Arduino výkonnější variantou!
Vývojová prostředí a nástroje | Webové prohlížeče | Seznam freehostingů
Odpovědět

Zpět na „Programování a web“