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
semestralka z programovania v jave - CVUT
Re: semestralka z programovania v jave - CVUT
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 ?
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
- Príspevky: 6719
- Registrovaný: 18 sep 2005, 13:44
- Bydlisko: Prague, CZE / Kosice, SVK
Re: semestralka z programovania v jave - CVUT
presne to co si napisal som ti tam poslal v tom linku na wikipediu
a chvalim ta za to
je jasne ze je to pomale, ale nejdes pocitat matice 1000x1000 takze ti to moze byt sum a fuk
Re: semestralka z programovania v jave - CVUT
dakujem velmi si to cenim ze dostanem niaku pochvalu
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 ?
btw : ..tie styri cykly sa nedaju obist vsak ?