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 [???]