コード例 #1
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;
  
}
コード例 #2
0
ファイル: iNEMO_math.c プロジェクト: Hilabete/BLE_Blance_Car
/**
********************************************************************************
* @brief Create an Empty Matrix of Short Int
* @param  nRow  : Number of Rows
* @param  nCol  : Number of columns
* @param  nType : specifies as to fill the Matrix
* @retval Pointer to iNEMO_sMATRIX_TYPE
* @par Functions called:
* None
*/
iNEMO_fMATRIX_TYPE *iNEMO_fMatCreateInit(int nRow, int nCol, int nType)
{
  iNEMO_fMATRIX_TYPE* pTmp;
  int 	i, j;

  if(nRow==0 || nCol==0)
	return(NULL);

  if ((pTmp = iNEMO_fMatCreate( nRow, nCol )) != NULL)
  {
      switch (nType)
      {
        case iNEMO_ZERO_MATRIX:
        case iNEMO_IDEN_MATRIX:
        case iNEMO_ONES_MATRIX:
	  for (i=0; i < nRow; i++)
        for (j=0; j < nCol; j++)
	    {
          /* Fills of ones */
		  if (nType == iNEMO_ONES_MATRIX)
		  {
            iNEMO_MatData(pTmp)[i][j] = 1.0f;
		    continue;
          }
          /* Fills as Identity Matrix */
		  if (nType == iNEMO_IDEN_MATRIX)
		  {
		    if (i==j)
		    {
              iNEMO_MatData(pTmp)[i][j] = 1.0f;
		      continue;
		    }
		  }
                  /* Fills of zeros */
                  iNEMO_MatData(pTmp)[i][j] = 0.0f;
	      }
	  break;
      }
     return (pTmp);
  }
  else
     return (NULL);
}
コード例 #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
ファイル: iNEMO_math.c プロジェクト: Hilabete/BLE_Blance_Car
/**
********************************************************************************
* @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);
  }

}