public double compute ( DMatrix1Row mat ) { if ( width != mat . numCols || width != mat . numRows ) { throw new RuntimeException ( "Unexpected matrix dimension" ) ; } // make sure everything is in the proper state before it starts initStructures ( ) ; // System.arraycopy(mat.data,0,minorMatrix[0],0,mat.data.length); int level = 0 ; while ( true ) { int levelWidth = width - level ; int levelIndex = levelIndexes [ level ] ; if ( levelIndex == levelWidth ) { if ( level == 0 ) { return levelResults [ 0 ] ; } int prevLevelIndex = levelIndexes [ level - 1 ] ++ ; double val = mat . get ( ( level - 1 ) * width + levelRemoved [ level - 1 ] ) ; if ( prevLevelIndex % 2 == 0 ) { levelResults [ level - 1 ] += val * levelResults [ level ] ; } else { levelResults [ level - 1 ] -= val * levelResults [ level ] ; } putIntoOpen ( level - 1 ) ; levelResults [ level ] = 0 ; levelIndexes [ level ] = 0 ; level -- ; } else { int excluded = openRemove ( levelIndex ) ; levelRemoved [ level ] = excluded ; if ( levelWidth == minWidth ) { createMinor ( mat ) ; double subresult = mat . get ( level * width + levelRemoved [ level ] ) ; subresult *= UnrolledDeterminantFromMinor_DDRM . det ( tempMat ) ; if ( levelIndex % 2 == 0 ) { levelResults [ level ] += subresult ; } else { levelResults [ level ] -= subresult ; } // put it back into the list putIntoOpen ( level ) ; levelIndexes [ level ] ++ ; } else { level ++ ; } } } }
Computes the determinant for the specified matrix . It must be square and have the same width and height as what was specified in the constructor .