예제 #1
0
파일: iNEMO_EKF.c 프로젝트: dessel/stf12
iNEMO_fMATRIX_TYPE* iNEMO_UpdateP(iNEMO_fMATRIX_TYPE* pPoldMat,
                            iNEMO_fMATRIX_TYPE* pKMat,
                            iNEMO_fMATRIX_TYPE* pHJMat, 
                            iNEMO_fMATRIX_TYPE* pPnewMat)
{
  iNEMO_fMATRIX_TYPE* pTmp;
  iNEMO_fMATRIX_TYPE* pI;
   
  pTmp = iNEMO_fMatCreateZero(iNEMO_MatRow(pPoldMat), iNEMO_MatCol(pPoldMat));
  pI = iNEMO_fMatCreateUnit(iNEMO_MatRow(pPoldMat), iNEMO_MatCol(pPoldMat));

  // First Step: pTmp = (pKMat * pHJMat)
  pTmp = iNEMO_fMatMulMat(pKMat, pHJMat, pTmp); 

  // Second Step: pTmp = I - pTmp
  pTmp = iNEMO_fMatSub(pI, pTmp, pTmp);
  
  // Third Step: pPnewMat = pTmp * pPoldMat
  pPnewMat = iNEMO_fMatMulMat(pTmp, pPoldMat, pPnewMat);
  
  iNEMO_fMatFree(pTmp); 
  iNEMO_fMatFree(pI);
  
  return (pPnewMat);  
}
예제 #2
0
파일: iNEMO_EKF.c 프로젝트: dessel/stf12
iNEMO_fMATRIX_TYPE* iNEMO_CalculateK(iNEMO_fMATRIX_TYPE* pPMat,
                               iNEMO_fMATRIX_TYPE* pHJMat,
                               iNEMO_fMATRIX_TYPE* pRMat,
                               iNEMO_fMATRIX_TYPE* pKMat)
{
  /* Internal Variables */
  iNEMO_fMATRIX_TYPE* pTmp1;
  iNEMO_fMATRIX_TYPE* pTmp2;
  iNEMO_fMATRIX_TYPE* pRInvMat;
  
  pTmp1 = iNEMO_fMatCreate(iNEMO_MatRow(pPMat), iNEMO_MatRow(pHJMat));
  pTmp2 = iNEMO_fMatCreate(iNEMO_MatRow(pHJMat), iNEMO_MatCol(pTmp1));  
  
  /* First Step: pTmp1 = pPMat * pHJMat' */
  pTmp1 = iNEMO_fMatMulMatMT(pPMat, pHJMat, pTmp1);
  
  /* Second Step: pTmp2 = pHJMat * (pPMat * pHJMat') = pHJMat * pTmp1 */
  pTmp2 = iNEMO_fMatMulMat(pHJMat, pTmp1, pTmp2);
  
  /* Third Step: pTmp2 = pTmp2 + pRMat */
  pTmp2 = iNEMO_fMatAdd(pTmp2, pRMat, pTmp2);
  
  /* Fourth Step: pRInvMat = (pTmp2)^-1 */
  pRInvMat = iNEMO_fMatCreate(iNEMO_MatRow(pTmp2), iNEMO_MatCol(pTmp2));
  
  pRInvMat = iNEMO_fMatInv(pTmp2, pRInvMat);
  
  /* Fifth Step: pKMat = pTmp1 * pRInvMat */
  pKMat = iNEMO_fMatMulMat(pTmp1, pRInvMat, pKMat);
  
  /* Delete the Temporary Matrix before to exit */
  iNEMO_fMatFree(pTmp1);
  iNEMO_fMatFree(pTmp2);  
  iNEMO_fMatFree(pRInvMat);  
  
  return pKMat;
  
}
예제 #3
0
파일: iNEMO_EKF.c 프로젝트: dessel/stf12
iNEMO_fMATRIX_TYPE* iNEMO_PropagateP(iNEMO_fMATRIX_TYPE* pPoldMat, 
                                    iNEMO_fMATRIX_TYPE* pStateMat, 
                                    iNEMO_fMATRIX_TYPE* pQMat, 
                                    iNEMO_fMATRIX_TYPE* pPnewMat)
{
  /* Internal Variables */
  iNEMO_fMATRIX_TYPE* pTmp;

  pTmp = iNEMO_fMatCreate(iNEMO_MatRow(pPoldMat), iNEMO_MatCol(pPoldMat));
  
  /* First Step: pTmp = pStateMat * pPoldMat */
  pTmp = iNEMO_fMatMulMat(pStateMat, pPoldMat, pTmp);

  /* Second Step: pPnewMat = pTmp * pStateMat' */
  pPnewMat = iNEMO_fMatMulMatMT(pTmp, pStateMat, pPnewMat);

  /* Third Step: pPnewMat += Q */
  pPnewMat = iNEMO_fMatAdd(pPnewMat, pQMat, pPnewMat);
  
  /* Delete the Temporary Matrix before to exit */
  iNEMO_fMatFree(pTmp);
  
  return pPnewMat;  
}
예제 #4
0
/**
********************************************************************************
* @brief Find Inverse of a Matrix
* @param pSource : the source Matrix
* @param pDest   : square inverse matrix of pSource, NULL in case of fail 
* @retval the resulting Matrix
* @par Functions called:
* @ref iNEMO_fMatCreate
* @ref iNEMO_fMatCopy
* @ref iNEMO_MatLUP 
* @ref iNEMO_fMatFree 
*/
iNEMO_fMATRIX_TYPE* iNEMO_fMatInv(iNEMO_fMATRIX_TYPE* pSource,
                                iNEMO_fMATRIX_TYPE* pDest)
{
  iNEMO_fMATRIX_TYPE* A;
  iNEMO_fMATRIX_TYPE* B;
  iNEMO_sMATRIX_TYPE* P;
  int i, nCol, nRow;

  nCol = iNEMO_MatCol(pSource);
  nRow = iNEMO_MatRow(pSource);

  if (nCol != nRow)
    /* The matrix is not Square */
    return (NULL);

  A = iNEMO_fMatCreate(nRow, nCol);
  if (A == NULL)
    return (NULL);

  B = iNEMO_fMatCreate(nRow, nCol);
  if (B == NULL)
    return (NULL);

  /* P is a vector matrix */
  P = iNEMO_sMatCreate(nRow, 1);
  if (P == NULL)
    return (NULL);

  /* It is to avoid to modify pSource Matrix */
  iNEMO_fMatCopy(pSource, A);

  /* LU Decomposition and check for Singular Matrix */
  if (iNEMO_MatLUP(A, P) == -1)
  {
    iNEMO_fMatFree(A);
    iNEMO_fMatFree(B);
    iNEMO_sMatFree(P);

    return (NULL);
  }

  for (i=0; i<nCol; ++i)
  {
    iNEMO_fMatFill(B, 0.0f);

    iNEMO_MatData(B)[i][0] = 1.0f;
    iNEMO_MatBackSubs(A, B, P, pDest, i);
  }
  iNEMO_fMatFree(A);
  iNEMO_fMatFree(B);
  iNEMO_sMatFree(P);

  if (pDest == NULL)
  {
    return(NULL);
  }
  else
  {
    return (pDest);
  }

}