Problem z sortowaniem (macierze)

0

Aby macierz była nieosobliwa(wyznacznik różny od zera) nie może posiadać na swojej przekątnej żadnego zera, mam pewne dane (poniżej zamieszczone w kodzie). Problem polega na tym aby wiersze w tej macierzy tak pozamieniać aby na przekątnej były same "jedynki" przy czym nie można zmieniać kolejności kolumn. Napisałem algorytm który działa tylko w pewnych przypadkach a z zamieszczonym poniżej ma problem. Może ktoś pomoże mi to rozwiązać ? Z góry dziękuję za pomoc.

#include <stdio.h>
#include <conio.h>


void zamien(int co, int czym);

float A[100][100];
float temp[100];

int n, max, tup;
int i, j;

void main()
{

   n=8;  //rozmiar macierzy 8x8

   // Wprowadzenie danych
   A[0][0]=1;
   A[1][0]=1;
   A[1][3]=1;
   A[2][0]=1;
   A[2][7]=1;
   A[3][1]=1;
   A[3][4]=1;
   A[4][1]=1;
   A[4][5]=1;
   A[5][2]=1;
   A[5][5]=1;
   A[6][2]=1;
   A[6][6]=1;
   A[7][2]=1;
   A[7][7]=1;
   A[0][8]=0;
   A[1][8]=1;
   A[2][8]=2;
   A[3][8]=3;
   A[4][8]=4;
   A[5][8]=5;
   A[6][8]=6;

   //wyśiwetlenie zawartości macierzy
   for(i=0; i<n; i++)
   {
      for(j=0; j<n; j++)
      {
      printf("%.1f \t", A[i][j]);
      }
      printf("\n");
   }
   printf("\n\n\n");


   //tutaj zamiana wierszy miejscami
   for(i=0; i<n; i++)
   {
      if(A[i][i]==0)
      {
         max=i;
         tup=A[i][i];
         for(j=0; j<n; j++)
         {
            if(A[j][i]>tup)
            {
               max=j;
               tup=A[j][i];
            }
         }
         if(max==i)
         {
            printf("Stop!");
            return;
         }
         else
         {
            for(u=0; u<n; u++)
               temp[u]=A[max][u];
            for(u=0; u<n; u++)
               A[max][u]=A[i][u];
            for(u=0; u<n; u++)
               A[i][u]=temp[u];

         }
      }
   }

   //wyświetlenie wyników po sortowaniu
   for(i=0; i<n; i++)
   {
      for(j=0; j<n; j++)
      {
      printf("%.1f \t", A[i][j]);
      }
      printf("\n");
   }

   for(i=0; i<n; i++)
   {
      if (A[i][i] == 0)
      {
         printf("Wartosci na przekatnej musza byc rozne od 0\n");
         getch();
         return;
      }
   }


   getch();
   return;

}

Program dla tych danych, czyli macierz(8x8) o postaci:

1.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0
1.0     0.0     0.0     1.0     0.0     0.0     0.0     0.0
1.0     0.0     0.0     0.0     0.0     0.0     0.0     1.0
0.0     1.0     0.0     0.0     1.0     0.0     0.0     0.0
0.0     1.0     0.0     0.0     0.0     1.0     0.0     0.0
0.0     0.0     1.0     0.0     0.0     1.0     0.0     0.0
0.0     0.0     1.0     0.0     0.0     0.0     1.0     0.0
0.0     0.0     1.0     0.0     0.0     0.0     0.0     1.0

daje wyniki następujące:

1.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0
1.0     0.0     0.0     0.0     0.0     0.0     0.0     1.0
0.0     0.0     1.0     0.0     0.0     1.0     0.0     0.0
1.0     0.0     0.0     1.0     0.0     0.0     0.0     0.0
0.0     1.0     0.0     0.0     1.0     0.0     0.0     0.0
0.0     1.0     0.0     0.0     0.0     1.0     0.0     0.0
0.0     0.0     1.0     0.0     0.0     0.0     1.0     0.0
0.0     0.0     1.0     0.0     0.0     0.0     0.0     1.0

W drugim wierszu w drugiej kolumnie znajduje się zero. Czyli wyniki są nie do przyjęcia ponieważ nie może być na przekątnej "zera"!

Dla dla innych danych działa, np. proszę wrzucić takie dane:


   n=7;
   A[0][2]=1;
   A[1][4]=1;
   A[2][0]=1;
   A[2][3]=1;
   A[3][0]=1;
   A[3][4]=1;
   A[4][1]=1;
   A[4][4]=1;
   A[5][1]=1;
   A[5][5]=1;
   A[6][1]=1;
   A[6][6]=1;

Dla tych danych czyli dla macierzy(7x7):

0.0     0.0     1.0     0.0     0.0     0.0     0.0
0.0     0.0     0.0     0.0     1.0     0.0     0.0
1.0     0.0     0.0     1.0     0.0     0.0     0.0
1.0     0.0     0.0     0.0     1.0     0.0     0.0
0.0     1.0     0.0     0.0     1.0     0.0     0.0
0.0     1.0     0.0     0.0     0.0     1.0     0.0
0.0     1.0     0.0     0.0     0.0     0.0     1.0

wyniki sortowania wyglądają tak:

1.0     0.0     0.0     0.0     1.0     0.0     0.0
0.0     1.0     0.0     0.0     1.0     0.0     0.0
0.0     0.0     1.0     0.0     0.0     0.0     0.0
1.0     0.0     0.0     1.0     0.0     0.0     0.0
0.0     0.0     0.0     0.0     1.0     0.0     0.0
0.0     1.0     0.0     0.0     0.0     1.0     0.0
0.0     1.0     0.0     0.0     0.0     0.0     1.0
0

Skąd tyś taką definicję liczenia wyznacznika wytrzasnął?!?!
O rozwinięciu Laplace'a albo metodzie Gaussa nie słyszałeś? Dodam, że komputery najczęściej z metody Gaussa korzystają...

0

Żadnej definicji tutaj nie przytaczałem kolego - to po pierwsze, a po drugie to właśnie metoda Gaussa wymaga by na diagonali nie było zer. poza tym chodzi tylko o posortowanie tego zapomnij o wyznaczniku jeśli masz z tym problem, chcę aby na przekątnej były same jedynki.

0
 for(j=0; j<n; j++)
         {
            if(A[j][i]>tup)
            {
               max=j;
               tup=A[j][i];
            }
         }

zamień na:

for(j=i+1; j<n; j++)

chodzi o to, że nie możesz ruszać wierszy, które już przestawiłeś, bo istnieje możliwość, że zamienisz np. pierwszy z trzecim, a potem z powrotem trzeci z pierwszym (i tak się właśnie dzieje).

0

Dzięki, za podpowiedź ale to nie załatwia problemu, zmień skompiluj i zobacz.

0

przeczytaj rtfm, a nastepnie przesledz co sie dzieje po zmianie i to opisz, a nie kaz tego robic Hrypie

0

Aby macierz była nieosobliwa(wyznacznik różny od zera) nie może posiadać na swojej przekątnej żadnego zera,
To zdanie jest błędne. Nieosobliwość macierzy leży w czym innym. Diagonala nie ma tu znaczenia.

0

Wiem, mój błąd :| pomyliłem się.

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