diff --git a/mex/sources/block_kalman_filter/block_kalman_filter.cc b/mex/sources/block_kalman_filter/block_kalman_filter.cc
index 56929b6796d8242c6f9261a080a113e72fc376f5..930041b6e21eb1474852d28d2af0be7662bc0d5d 100644
--- a/mex/sources/block_kalman_filter/block_kalman_filter.cc
+++ b/mex/sources/block_kalman_filter/block_kalman_filter.cc
@@ -202,14 +202,16 @@ not_all_abs_F_bellow_crit(double* F, int size, double crit)
 
 
 double
-det(double* F, int dim)
+det(double* F, int dim, int* ipiv)
 {
   double det = 1.0;
   for (int i = 0; i < dim; i++)
-    det *= F[i * (1 + dim)];
+    if (ipiv[i] - 1 == i)
+      det *= F[i + i * dim];
+    else
+      det *= -F[i + i * dim];
   return det;
 }
-
 void
 mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
 {
@@ -527,7 +529,7 @@ mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
           F_singular = false;
           
           //dF     = det(F);
-          dF     = abs(det(iF, pp));
+          dF     = det(iF, pp, ipiv);
 
           //iF     = inv(F);
           //int lwork = 4/*2*/* pp;