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; }
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; }
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; }