semestralka z programovania v jave - CVUT

Programovacie jazyky, rady, poradňa...
mirak2
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6719
Registrovaný: 18 sep 2005, 13:44
Bydlisko: Prague, CZE / Kosice, SVK

Re: semestralka z programovania v jave - CVUT

Príspevok od používateľa mirak2 »

nevadi, tak nemusis mat objekt, staci ked to budes nacitavat do stringu, co je nie vhodne, nevadi, na tieto ucely postaci...hlavne teda potrebujes doplnit nacitanie do nejakej struktury - pole alebo arraylist(dynamicke pole)...
vyhladavanie bude prebiehat tak ze prejdes strukturu a na kazdy prvok (teda kazdy string) sa budes pytat contains...a pri true vypises prvok...myslim ze trivialne

k tej matici: mne by sa nechcelo nakodit kroky z gaussovej metody, pozrel by som sa po inom algoritme, neviem ake mas znalosti z algebry (rozvoj determinantu), ale toto je celkom zrozumitelne - http://en.wikipedia.org/wiki/Invertible ... c_solution - mas tam priklad pre 2x2 a 3x3 matice ale ak vies co je rozvoj determinantu tak sa to da urobit pre lubovolnu velkost...je to ale trochu advanced by som povedal
azicko
Amateur
Amateur
Príspevky: 13
Registrovaný: 15 mar 2010, 19:44

Re: semestralka z programovania v jave - CVUT

Príspevok od používateľa azicko »

dakujem za myslienku, spravil som to pomocou adjungovanej matice, tz. rozvoj podla kazdeho clena - vypocet determinantu "podmatice" ktora vznikne vynehanim iteho riadku jteho stlpca, to cele * (-1)^i+j, vysledky som zapisoval po riadkoch, nasledne som to transponoval a vynasobil kazdy clen 1/det povodnej matice :) ...a vysla mi inverzna :) ... akurat je to riesenie ktore nieje efektivne, gem by bol z hladiska narocnosti pre pc menej brutalny, tie styri cykly ..mno nevim no

alebo sa to da inak napisat ?

Kód: Vybrať všetko

static double[][] inverzia(double[][] mat){

         int i,j,k,l;
         double cislo;

         double[][] pomocna = new double[mat.length-1][mat[0].length-1];
         double[][] vysledna = new double[mat.length][mat[0].length];
         double[][] inverzna = new double[mat.length][mat[0].length];

         for(i=1;i<=mat.length;i++){
             for(j=1;j<=mat[0].length;j++){
                int x=0;
                 int y=0;
                  for(k=1;k<=mat.length;k++){
                     for(l=1;l<=mat[0].length;l++){
                         if ((i!=k) && (j!=l)){
                            
                             pomocna[x][y] = mat[k-1][l-1];
                             y++;

                             if (y==(pomocna.length)){
                                 y=0; x++;
                             }
                             
                             
                             
                         }
                     }
                 }
                 cislo = Math.pow(-1,i+j)*determinant(pomocna);
                 vysledna[i-1][j-1] = cislo;
             }
         }
         inverzna = nasobok(transpMat(vysledna),1/determinant(mat));

         return inverzna;
   
    }

Kód: Vybrať všetko

static double determinant(double[][] mat) {

        double det = 0;
        int i,j,k;

        if(mat.length == 1) {
                    det = mat[0][0];
                    return det;
        }

        if(mat.length == 2) {
                    det = mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0];
        return det;
        }

        for(i = 0; i < mat[0].length; i++) {
            double pomocna[][] = new double[mat.length - 1][mat[0].length - 1];
                for(j = 1; j < mat.length; j++) {
                    for(k = 0; k < mat[0].length; k++) {
                        if(k < i) {
                            pomocna[j - 1][k] = mat[j][k];
                        } else if(k > i) {
                            pomocna[j - 1][k - 1] = mat[j][k];
                          }

                    }
                }

        det += mat[0][i] * Math.pow(-1, (double)i) * determinant(pomocna);
        }

     return det;

     }

Kód: Vybrať všetko

static double[][] nasobok(double[][] mat,double k){

         double[][] nasobok = new double[mat.length][mat[0].length];
         int i,j;

         for(i=0;i<mat.length;i++){
             for (j=0;j<mat[0].length;j++){
                 nasobok[i][j] = 0;
                 nasobok[i][j] += mat[i][j]*k;
             }
         }
         return nasobok;
     }
mirak2
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6719
Registrovaný: 18 sep 2005, 13:44
Bydlisko: Prague, CZE / Kosice, SVK

Re: semestralka z programovania v jave - CVUT

Príspevok od používateľa mirak2 »

presne to co si napisal som ti tam poslal v tom linku na wikipediu :D a chvalim ta za to :D je jasne ze je to pomale, ale nejdes pocitat matice 1000x1000 takze ti to moze byt sum a fuk
azicko
Amateur
Amateur
Príspevky: 13
Registrovaný: 15 mar 2010, 19:44

Re: semestralka z programovania v jave - CVUT

Príspevok od používateľa azicko »

dakujem velmi si to cenim ze dostanem niaku pochvalu :oops: :wink: chcel by som este tu semestralku rozdelit do tried ..ale neviem to ..niaky good link na to ?

btw : ..tie styri cykly sa nedaju obist vsak ?
Napísať odpoveď