Liczenie macierzy odwrotnej

0

Witam, mam do napisania program z działaniami na macierzach. Wszystko ok tylko, że okazało się że muszę dodać jeszcze funkcje obliczania macierzy odwrotnej. Nie mam pojęcia szczerze jak to zrobić. Mam funkcję liczenia wyznacznika i liczenia macierzy transponowanej jednak nie potrafię obliczyć macierzy dopełnień algebraicznych. Proszę o pomoc gdyż od tego zależy moje życie...

Tutaj jest kod mojego programu: http://pastebin.com/MWqKrqsa

0
long double
   B[MAXCOLS*MAXCOLS],
   C[MAXCOLS*MAXCOLS],
   *br[MAXCOLS],
   *cr[MAXCOLS],
  ;

bool Mat::_invB2C()
  {
   long double *by=B,*cy=C,**bry=br,**cry=cr;
   for(unsigned y=0;y<Cols;++y,by+=Cols)
     {
      (*(bry++))=by;
      (*(cry++))=cy;
      for(unsigned x=0;x<Cols;++x) *(cy++)=(x==y);
     }
   for(unsigned y=0;y<Cols;++y)
     { 
      long double w=br[y][y]; 
      if(!w)
        { 
         unsigned i;
         for(i=y+1;;++i)
           {
            if(i>=Cols)
              {
               w=1E-100;
               return false;
              }
            w=br[i][y];
            if(w)
              {
               long double *t;
               t=br[y]; br[y]=br[i]; br[i]=t;
               t=cr[y]; cr[y]=cr[i]; cr[i]=t;
               break;
              }
           }
        }
      for(unsigned x=0;x<Cols;++x)
        {
         br[y][x]/=w;
         cr[y][x]/=w;
        }
      for(unsigned x=0;x<Cols;++x)
        {
         if(x!=y)
           {
            w=br[x][y]; 
            for(unsigned i=0;i<Cols;++i)
              {
               br[x][i]-=br[y][i]*w; 
               cr[x][i]-=cr[y][i]*w; 
              }
           } 
        } 
     }
   return true;
  }
0

Dziekuje bardzo za pomoc i poswiecony czas ale nie jest to do konca to o co mi chodzilo. Mianowicie chcialbym aby ta funkcja byla mozliwie jak najprostsza i aby byla metoda klasy macierz z mojego programu. Słyszałem sugestie ze moge przerobic funkcje liczaca wyznacznik, ktora mam w programie tak aby otrzymac funkcje liczaca macierz dopelnien, ale niestety rowniez nie wiem jak to zrobic.

0

@ Rev oczywiście, że umiem to obliczać z punktu widzenia matematycznego ale mimo wszystko przełożenie tego na c++ nie jest takie wcale proste...

0

Popatrzyłem w kod i zdziwiło mnie parę rzeczy:
metoda wyznacznik przyjmuje jakieś dziwne parametry!
Powinieneś mieć takie metody wyznacznik:

     double wyznacznik() const;
     double wyznacznik(int i, int j) const; // wyznacznik bez i-tej kolumny i k-tego wiersza
     double wyznacznik(int column, const Wektor& vector) const; // wyznacznik z zastąpieniem kolumny numer column przez vector
     double wyznacznik(int column, const double *vectorData) const; // to samo co wyżej tylko w innej formie, wiadomo ile powinno być liczb w tej tablicy na podstawie samej macierzy

Masz osobną klasę na macierz jednostkową, zamiast po prostu wystawić metodę (statyczną) zwracającą taką macierz.

      static Macierz jednostkowa(int size);
      Macierz jednostkowa(); // rozmiar ustalany na podstawie bieżącej macierzy

Co do samego problemu, naprawdę nie brakuje w internecie opisu kilku algorytmów, w różnych językach. Nic tylko znaleźć, przeanalizować i przepisać.

0

Metoda wyznacznik jest gotową metodą z jakiegoś portalu edukacyjnego przerobioną na potrzeby mojego programu (dynamiczna alokacja pamięci). Działa bez zarzutu dla każdego wymiaru macierzy. Natomiast co do macierzy dopełnień to nie znalazłem żadnego przykładowego kodu w sieci, nawet na stronach anglojęzycznych są kody tylko dla macierzy 3x3 (a ja musze miec dla kazdego rozmiaru).

0

ja nie twierdzę, że metoda wyznacznik, nie działa ci poprawnie, a jedynie, że źle zdefiniowałeś tą metodę. naruszasz zasady programowania obiektowego. Najlepiej widać to po tym, jak wywołujesz tą metodę: musisz do niej wpychać zawartość samego obiektu, a przecież metoda ta już zna zawartość tego obiektu (naruszasz hermetyzację).

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