dopełnienie macierzy

0

tak liczę wyznacznik:

int wyznacznik(macierz_t *macierz1)
{
    float det;
    int i,j,k,x;
    float niezerowy=macierz1->macierz[0][0];                                    

    if(macierz1->lw==1)
    {
        return(macierz1->macierz[0][0]);                                        /*zwraca element, jeśli macierz jest 1x1*/
    }
    else 
    {
        for(j=0;j<macierz1->lk;j++)                                             /*szuka niezerowego elementu w pierwszym wierszu*/
        {
            if(macierz1->macierz[0][j]!=0)
            {
                niezerowy=macierz1->macierz[0][j];
                x=j;                                                            /*przypisuje numer kolumny zmiennej x*/
            }
        }
        
        for(i=0;i<macierz1->lw;i++)                                             /*zamienia kolumny*/
        {
            niezerowy=macierz1->macierz[i][0];
            macierz1->macierz[i][0]=macierz1->macierz[i][x];
            macierz1->macierz[i][x]=niezerowy;
        }
        
        for(i=0;i<macierz1->lw-1;i++)                                           /*wykorzystując metodę eliminacji gaussa zeruje elementy*/
        {                                                                       /*pod przekątną diagonalną*/
            for(j=i+1;j<macierz1->lw;j++)
            {
                for(k=i+1;k<macierz1->lk;k++)
                macierz1->macierz[j][k]-=(macierz1->macierz[j][i]/macierz1->macierz[i][i])*macierz1->macierz[i][k];
            }
        }
    
        det=1;
        for(i=0;i<macierz1->lw;i++) det*=macierz1->macierz[i][i];               /*wyznacznik macierzy równy jest iloczynowi elementów*/
    }                                                                           /*na przekątnej diagonalnej*/
    return(-det);                                                               /*zamieniliśmy jedną kolumnę, więc zmieniamy znak ma*/
}                                                                               /*przeciwny*/

tak dopełnienie:

void dopelnienie(macierz_t *macierz1)
{
    macierz_t macierz2;
    macierz_t dop;
    int p,q,m,n,i,j;
     
    macierz2.lw=macierz1->lw;
    macierz2.lk=macierz1->lw;
    dop.lw=macierz1->lw;
    dop.lk=macierz1->lw;
    alokuj_tablice_macierzy(&macierz2);
    alokuj_tablice_macierzy(&dop);
        
    for(q=0;q<macierz1->lw;q++)
    {
            for(p=0;p<macierz1->lk;p++)
            {
                    m=0;
                    n=0;
                    for(i=0;i<macierz1->lw;i++)
                    {
                             for(j=0;j<macierz1->lk;j++)
                             {
                                      macierz2.macierz[i][j]=0;
                                      if(i!=q&&j!=p)
                                      {
                                            macierz2.macierz[m][n]=macierz1->macierz[i][j];
                                            if(n<(macierz1->lk-2))
                                            n++;
                                      else
                                      {
                                          n=0;
                                          m++;
                                      }
                                      }
                             }
                    }
                    macierz2.lw=macierz2.lw-1;
                    dop.macierz[q][p]=pow(-1,q+p)*wyznacznik(&macierz2);
            }
    }
    for(i=0;i<macierz1->lw;i++)
    {
        printf("\n");
        for(j=0;j<macierz1->lw;j++)
            printf("%g ", dop.macierz[i][j]);
    }
    trans(macierz1, &dop);
}

wyznacznik liczony jest dobrze (z wyjątkiem opcji, gdy w pierwszym wierszu są same zera lub jedyny nieujemny element pierwszego wiersza jest na pozycji [0][0]), lecz macierz dopełnień już źle. podejrzewam, że błąd kryje się w tych linijkach:

 macierz2.lw=macierz2.lw-1;
                    dop.macierz[q][p]=pow(-1,q+p)*wyznacznik(&macierz2);

wszystko działało dobrze do momentu gdy zacząłem rozmiar macierzy wrzucać do struktury. jeśli był on podany jako kolejny argument funkcji wyznacznik() i dopełnienie() liczyło w porząku [???]

0

Metodą Sarrusa nie prościej :P?

0

tzn?

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