diff --git a/mex/sources/block_kalman_filter/block_kalman_filter.cc b/mex/sources/block_kalman_filter/block_kalman_filter.cc index 2d5f1d5d5d24a63d41b7c410603014439f0dd9bb..56929b6796d8242c6f9261a080a113e72fc376f5 100644 --- a/mex/sources/block_kalman_filter/block_kalman_filter.cc +++ b/mex/sources/block_kalman_filter/block_kalman_filter.cc @@ -403,18 +403,48 @@ mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { mexPrintf("error: F singular\n"); double LIK = Inf; - if (nlhs >= 1) + // info = 0 + plhs[0] = mxCreateDoubleScalar(0); + if (nlhs >= 2) { - plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL); - double* pind = mxGetPr(plhs[0]); + plhs[1] = mxCreateDoubleMatrix(1, 1, mxREAL); + double* pind = mxGetPr(plhs[1]); pind[0] = LIK; } - if (nlhs == 2) + + if (nlhs == 3) { for (int i = t; i < smpl; i++) lik[i] = Inf; - plhs[1] = plik; + plhs[2] = plik; } + else + mxDestroyArray(plik); + mxFree(w); +#ifdef DIRECT + mxFree(i_nz_state_var); +#else + mxFree(Var); + mxFree(Var_2); +#endif + mxFree(tmp_a); + mxFree(v_pp); + mxFree(v_n); + mxFree(mf); + mxFree(w); + mxFree(iw); + mxFree(ipiv); + mxFree(oldK); + mxFree(P_mf); + mxDestroyArray(pa); + mxDestroyArray(p_tmp); + mxDestroyArray(pQQ); + mxDestroyArray(pv); + mxDestroyArray(pF); + mxDestroyArray(piF); + mxDestroyArray(p_P_t_t1); + mxDestroyArray(pK); + mxDestroyArray(p_K_P); return; } else