int solve(FILE* fp){ int n = getsize(fp),i,j; float *array = (float *) malloc (((n+1)*n)*sizeof(float)); float det = 1.0; generate(array,n,fp); int flag = 0; for(j=0;j<n-1;j++){ int k=j,l; float pivot=*(array+(n)*j+j); if(abs(pivot)<=0.01){ //Swap if pivots get too small flag += rowswap(array,j,n); pivot=*(array+(n)*j+j); } for(l=k+1;l<n;l++){ float next=*(array+(n)*(l)+j)/pivot; for(i=j;i<n+1;i++) *(array+(n)*l+i)-=*(array+(n)*(k)+i)*next; } } for(i=0;i<n;i++){ float ii = *(array + n*i + i); det *= ii; } for(i=0;i<flag;i++){ det*=-1; } printf("Determinant: %f\n",det); free(array); return 0; }
void gauss(int i, int j) { printab(); if(i+1<rows && j+1<cols) { if(notnull(i,j)==rows) gauss(i,j+1); else { if(!tab[j+i*cols]) { rowswap(i,notnull(i+1,j)); gauss(i,j); } else if(notnull(i+1,j)!=rows) { rowdux(i,j,notnull(i+1,j)); gauss(i,j); } else gauss(i+1,j+1); } } }
bool Matrix3::setInverse(const Matrix3& a) { Matrix3 _a(a); Matrix3& _b = *this; _b.setIdentity(); int i,j,i1; for(j=0;j<3;j++) { i1 = j; for(i=j+1;i<3;i++) if (Abs(_a(i,j)) > Abs(_a(i1,j))) i1 = i; rowswap(_a,i1,j); rowswap(_b,i1,j); if (FuzzyZero(_a(j,j))){ fprintf(stderr, "Taking inverse of singular Matrix3\n"); return false; } register Real div = Inv(_a(j,j)); _b(j,0) *= div; _b(j,1) *= div; _b(j,2) *= div; _a(j,0) *= div; _a(j,1) *= div; _a(j,2) *= div; for(i=0;i<3;i++) { if (i != j) { register Real tmp = _a(i,j); _b(i,0) -= tmp*_b(j,0); _b(i,1) -= tmp*_b(j,1); _b(i,2) -= tmp*_b(j,2); _a(i,0) -= tmp*_a(j,0); _a(i,1) -= tmp*_a(j,1); _a(i,2) -= tmp*_a(j,2); } } } return true; }
float uppertriag(float *array,int n){ int i,j; for(j=0;j<n-1;j++){ int k=j,l; float pivot1=*(array+(2*n)*j+j); if(abs(pivot1)<=0.01){ //Swap if pivots get too small rowswap(array,j,2*n); pivot1=*(array+(2*n)*j+j); } for(l=k+1;l<n;l++){ float next=*(array+(2*n)*(l)+j)/pivot1; for(i=j;i<2*n;i++) *(array+(2*n)*l+i)-=*(array+(2*n*k)+i)*next; } } return *(array + (2*n)*(n-1) + n-1); }