[C] wyznacznik macierzy

0

witam tym razem mam taki ciekawy probilem z ktorym nie wiem jak sobie poradzic [wstyd]
mianowice napisalem sobie programik w C obliczajacy wyznacznik macierzy... wszystko dziala i jest ok dopoki na glownej przekatnej nie pojawi sie zero... wtedy program sie wiesza bo korzystalem z eleiminacji Gaussa obliczajac wyznacznik

{
int i,j,k;
double pam,w;
for(k=0;k<m->wymiar-1;k++) {
for(i=k+1;i<m->wymiar;i++) {
pam=m->tab[i][k]/m->tab[k][k];
for(j=k;j<m->wymiar;j++) {
m->tab[i][j]= m->tab[i][j] - pam*m->tab[k][j];
}
}
}
w=1;
for(i=0;i<m->wymiar;i++) { 
w=w*m->tab[i][i]; 
}

i jak widzicie jesli na glownej pzrekatnej jest 0 to program probuje wykonac dzielenie przez 0 [glowa]
sprawa jest niby prosta bo wystarczy zamienic miejscami wiesz w ktorym wystepuje 0 na miejscu tab[i][i] z wierszem w ktorym to zero nie wystepuje i zmienic znak wyznacznika tylko jak to zrobic?

0

najprosciej bedzie wrzucic instrukcje warunkowa sprawdzajaca czy dzielimy przez zero i jezeli tak to robisz to co napisales.

0

Bez przestawienia wynik będzie zawsze równy 0, czyli zły.

Najlepiej wybierać zawsze największy element (moduł):

// wstawiamy przed tym dzieleniem:
 int kmax = -1;
 pam = 0;
 for(j = k; j < m->wymiar; j++) 
  if( pam < (w=fabs(m->tab[j][k]) ) kmax = j, pam = w;

 if( kmax < 0 ) return 0;  // macierz osobliwa, wyznacznik = 0
 else if( kmax > k )  // przestawiamy wiersze: k <-> kmax
  {
    // jeśli m->tab jest tablicą wskaźników to wystarczy zamienić: 
    // double *p = m->tab[k]; m->tab[k] = m->tab[kmax]; m->tab[kmax] = p; 
    
    // jeśli tab jest tablicą dwuwymiarową to jest gorzej i trzeba kopiować cały wiersz:
    for(j = 0; j < m->wymiar; j++)
    {
      w = m->tab[k][j];
      m->tab[k][j] = m->tab[kmax][j];
      m->tab[kmax][j] = w;
    }
  }
 
// teraz normalnie:
  pam = m->tab[i][k]/m->tab[k][k];
...
0

sprawdzasz czy jest 0, jezeli tak to zamieniasz wiersze i mnozysz wynik *(-1)

0

dzieki wielkie za pomoc juz dalem sobie rade z tym wyznacnzikiem podzrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1