示例#1
0
int main(int argc, char *argv[])
{
	int n = 3; //rows
	int m = 3; //cols
	double **matrix;
	FILE *fp;

	//Det could be computed only from square matrix
	if (n != m && n > 1)
		error(2);

	fp = fopen("matrix.txt", "r");
	if (!fp)
		error(0);

	matrix = alloc_matrix(n, m);
	parse_file(fp, matrix, n, m);
	print_matrix(matrix, n, m);
	printf("Det: %f\n", compute_det(matrix, n));

	dealloc_matrix(matrix, n);
	fclose(fp);

	getchar();

	return 0;
}
示例#2
0
double compute_det(double **matrix, int n)
{
	int i;
	int j;
	int whole_matrix;
	int submatrix;
	double det = 0;
	double **minor;

	if (n == 2) {
		//sarrus
		det = matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
	} else {
		det = 0;

		for (whole_matrix = 0; whole_matrix < n; whole_matrix++) {
			minor = (double **)malloc((n - 1) * sizeof(double *));

			for (i = 0; i < n - 1; i++)
				minor[i] = (double *)malloc((n - 1) * sizeof(double));

			for (i = 0; i < n - 1; i++) {
				submatrix = 0;

				for (j = 0; j < n; j++) {
					if (j == whole_matrix)
						continue;

					minor[i][submatrix] = matrix[i + 1][j];
					submatrix++;
				}
			}

			det += pow(-1.0, 1.0 + whole_matrix + 1.0) * matrix[0][whole_matrix] * compute_det(minor, n - 1);

			for (i = 0; i < n - 1; i++)
				free(minor[i]);

			free(minor);
		}
	}

	return det;
}
示例#3
0
inline bool GjkCollisionState::closest(VectorF& v)
{
   compute_det();
   for (int s = bits; s; --s) {
      if ((s & bits) == s) {
         if (valid(s | last_bit)) {
	         bits = s | last_bit;
            if (bits != 15)
    	         compute_vector(bits, v);
	         return true;
         }
      }
   }
   if (valid(last_bit)) {
      bits = last_bit;
      v = y[last];
      return true;
   }
   return false;
}