inline T slowDet(const ConstMatrixBase<T, BaseClass>& l) { if (!l.isSquare() || (l.rows() <= 1)) { MatrixException e("Invalid matrix for det()"); GPSTK_THROW(e); } // go recursion! if (l.rows() == 2) return l(0,0)*l(1,1) - l(0,1)*l(1,0); else { // use v[0,0] * det(minor matrix(0,0)) + // v[0,1] * det(minor matrix(0,1)) + ... size_t i; int sign; T det = 0; for (i = 0; i < l.rows(); i++) { sign = (i % 2) ? -1 : 1; if (l(0,i) != 0) det += sign * l(0,i) * slowDet(minorMatrix(l,0,i)); } return det; } }
double matrixDeterminant(double **A, int n){ int i; double det=0; double **B; B=allocateDoubleMatrix(n-1, n-1); if(n==2){ det=(A[0][0]*A[1][1])-(A[0][1]*A[1][0]); } else{ for(i=0;i<n;i++){ B=minorMatrix(A, n, i, 0); det += pow(-1,i)*A[0][i]*matrixDeterminant(B,n-1); } } return(det); }