[C++] Wyznacznik macierzy metodą Laplace'a

Problemowa
Użytkownik
Użytkownik
Posty: 27
Rejestracja: 25 lis 2012, o 14:56
Płeć: Kobieta
Lokalizacja: 3city

[C++] Wyznacznik macierzy metodą Laplace'a

Post autor: Problemowa »

Dzień dobry,

napisałam taki program obliczający wyznacznik macierzy, ale wyznaczniki są obliczane źle, czy ktoś mógłby mi powiedzieć w którym miejscu jest błąd? Wyznacznik jest mi potrzebny do większego programu i zależy mi, aby był obliczany właśnie metodą Laplaca...

Kod: Zaznacz cały

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <time.h>

using namespace std;

// funkcja wyznacznik

long double det(int stopien, int wiersz, int *wk, double *A)
{
  int i,j,k,r;
  int * kolumny = new int[stopien]; // wektor kolumn dla podmacierzy
  long double suma;

  if(stopien == 1)
    return A[wiersz*stopien + wk[0]];
  else
  {
    suma = 0; r = 1;
    for(i = 0; i < stopien; i++)
    {
      k = 0;
      for(j = 0; j < stopien - 1; j++)
      {
        if(k == i) k++;
        kolumny[j] = wk[k++];
      }
      suma += r * A[wiersz*stopien + wk[i]] * det(stopien - 1, wiersz + 1, kolumny, A);
      r = -r;
    }
  return suma;
  }
}


// Program g³ówny


int main()
{
  int i,j,n,m,p;
  cout << "Podaj rozmiar macierzy A = "; //podanie rozmiaru
  cin >> m;
  p=m*m;
  double * A = new double[p];
  cout << "Podaj elementy macierzy A = 
 "; //wczytanie macierzy
    for(i = 0; i < m; i++)
      for(j = 0; j < m; j++) cin >> A[i * m + j];
      cout << endl;
        int *nk = new int[m]; // wektor kolumn

  cout << setprecision(0)
       << fixed;

  cout << "Wprowadzona macierz to: 
";
    for(i = 0; i < m; i++)
   {
    for(j = 0; j < m; j++) cout << A[i * m + j] << " ";
    cout << endl;
   }


// Inicjujemy wektor kolumn

  for(i = 0; i < m; i++) nk[i] = i;

  cout << "Wprowadzona wektor kolumn to: 
";
    for(i = 0; i < m; i++) {cout << nk[i] << " ";
    cout << endl;} //czyli rozpatruje wektor 0 i 1


// Wyliczamy wyznacznik i wypisujemy

  cout << "det A = " << det(m, 0, nk, A);
  system("pause");
  return 0;
}
Ostatnio zmieniony 4 sty 2013, o 22:14 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[C++] Wyznacznik macierzy metodą Laplace'a

Post autor: Ser Cubus »

macierz składa się z wierszy i kolumn, w takim wypadku macierz powinna być tablicą dwuwymiarową, Ty inicjalizujesz tylko 1 wymiar

do tego masz 4 inty (i, j, k , r), nazwij je może jakoś konkretnie, aby łatwiej się czytało osobom postronnym
Problemowa
Użytkownik
Użytkownik
Posty: 27
Rejestracja: 25 lis 2012, o 14:56
Płeć: Kobieta
Lokalizacja: 3city

[C++] Wyznacznik macierzy metodą Laplace'a

Post autor: Problemowa »

Wiem, że powinno się zaimplementować jako tablicę dwuwymiarową, ale mam już zaimplementowane jako tablice jednowymiarową w moim głównym programie i nie chciałabym tego zmieniać...
Ser Cubus
Użytkownik
Użytkownik
Posty: 1406
Rejestracja: 6 maja 2012, o 22:46
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 107 razy
Pomógł: 145 razy

[C++] Wyznacznik macierzy metodą Laplace'a

Post autor: Ser Cubus »

hmm, więc pytanie jak rozumiesz tę macierz? czy to jest zawsze macierz jedno kolumnowa/wierszowa, czy może traktujesz w ten sposób, np tablica 4 elementowa

1 2
3 4

??
Problemowa
Użytkownik
Użytkownik
Posty: 27
Rejestracja: 25 lis 2012, o 14:56
Płeć: Kobieta
Lokalizacja: 3city

[C++] Wyznacznik macierzy metodą Laplace'a

Post autor: Problemowa »

Traktuję jako tablicę czteroelementową A[0],A[1],A[2],A[3]. Znalazłam miejsce, gdzie jest problem i nie wiem jak z tego wyjść...

Po obliczeniu analogowym, pokazało mi, że problem jest w definicji wyznacznika, a właściwie na samym końcu przy tej sumie
royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

[C++] Wyznacznik macierzy metodą Laplace'a

Post autor: royas »

Źle obliczasz indeksy w tej tablicy. Tzn. niby masz wiersz*stopien+kolumna.
Ale ten stopien ma złą wartość, bo pomniejszasz go w wywołaniach rekurencyjnych, ale cały czas odnosisz się do pełnej tablicy A. Powinnaś używać nie stopnia danej podmacierzy, ale rozmiar całej macierzy A, czyli to co masz w zmiennej m.
Problemowa
Użytkownik
Użytkownik
Posty: 27
Rejestracja: 25 lis 2012, o 14:56
Płeć: Kobieta
Lokalizacja: 3city

[C++] Wyznacznik macierzy metodą Laplace'a

Post autor: Problemowa »

To jak to poprawić, aby działało poprawnie? Siedzę już nad tym kilka dni...
royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

[C++] Wyznacznik macierzy metodą Laplace'a

Post autor: royas »

Tak na szybko i nie całkiem elegancko: przenieś zmienną m z main do globalnej przestrzeni. W funkcji det zamień każde wystąpienie stopien wewnątrz A[...] na m. Dobrze by też było to m nazwać jakąś dłuższą bardziej znaczącą nazwą, ale to już kosmetyka. Nie wiem czy to wszystko, ale sprawdziłem dla jednego przypadku i wyszło ok.

A rozwiązanie ładniejsze: dodaj jeszcze jeden parametr do det i przekazuj w nim bez zmian rozmiar rozmiar macierzy A.
ODPOWIEDZ