コード例 #1
0
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;
}
コード例 #2
0
ファイル: matrici.c プロジェクト: Disorganizzazione/Uni
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);
	}
    }
}
コード例 #3
0
ファイル: primitives.cpp プロジェクト: panjia1983/mintos
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;
}
コード例 #4
0
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);	
}