📄 xytest.c
字号:
/*********************************************************************** * XYTEST * ------ * Test state equation and observation equation before integrating them * in the filer routines. * Do the following: * o Write a function (in C) that contains the state equation. * o In the same file write a function containing the observation equation. * o Specify the name of the file in the "define variable" KALMFILE. * Remember to use " " around the name. * o Assign XFUNC to the name of the state equation function and assign * YFUNC to the name of the observation equation function (no " "!). * o Compile with the appropriate Matlab command: * >> mex xytest.c kalmlblx.o % PC-Linux gcc compiler * >> mex xytest.c kalmlblcc.obj % Matlab lcc compiler * o Call 'xytest' from Matlab as: * [y,x] = xytest(x,u,ny,v,w,init); * All 6 arguments must be passed. Use [] if an argument is not available. * ***********************************************************************/#define KALMFILE "fallfct.c"#define XFUNC falltu#define YFUNC fallobs/***********************************************************************//* * INCLUDE HEADERS */#include <stdio.h>#include <math.h>#include <time.h>#include "mex.h"/* * DEFINES ASSOCIATED WITH MATRIX MANIPULATION */#define ON 1#define OFF 0#define RUNCHK ON /* Run-time checks switched on/off. *//* Inline functions with similar output as the library functions listed below. *//* ( No run-time checks is performed, when inline functions are used ) */#define nof_rows(ptm) (ptm->row) /* See getrows */#define nof_cols(ptm) (ptm->col) /* See getcols */#define vec_len(ptv) (ptv->row+ptv->col-1) /* See length */#define get_val(ptm,row_pos,col_pos) (ptm->mat[row_pos][col_pos]) /* See mget */#define put_val(ptm,row_pos,col_pos,value) ((ptm->mat[row_pos][col_pos])=value) /* See mput */#define rvget(ptv,element) (ptv->mat[0][element]) /* See vget */#define cvget(ptv,element) (ptv->mat[element][0]) /* See vget */#define rvput(ptv,element,value) ((ptv->mat[0][element])=value) /* See vput */#define cvput(ptv,element,value) ((ptv->mat[element][0])=value) /* See vput *//* Declaration of the "abstract" data-type. */typedef struct { /* Matrix structure for C library */ int row; /* These are meant to be "private" */ int col; /* and should only be accessed via */ double **mat; /* the "member functions" below. */} matrix;typedef struct { /* Matrix structure for C library */ int row; /* These are meant to be "private" */ int col; /* and should only be accessed via */ int **mat; /* the "member functions" below. */} intmatrix;typedef struct { /* Optional initializations */ matrix *wmean; /* Mean of process noise */ matrix *vmean; /* Mean of measurement noise */ matrix *init; /* Initialization parameters */} optpar;/* Declaration of the "member functions". */matrix *mmake( int, int );void mfree( matrix* );void mprint( matrix* );void merror( char* );int getrows( matrix* );int getcols( matrix* );void minit( matrix* );void madd( matrix*, matrix*, matrix* );void mset( matrix*, matrix*);/* * PROTOTYPE DECLARATION */matrix* mat2sm(const mxArray*);void sm2mat(mxArray*, matrix*);intmatrix* mat2intsm(const mxArray*);void intsm2mat(mxArray*, intmatrix*);#include KALMFILE/********************************************************************************* * * * xytest gateway routine * * ---------------------- * * * * This is a small mex-gateway to test C-functions written by the user. * * * * * * Programmed by: Magnus Norgaard * * LastEditDate : Jan. 14, 2000 * * * *********************************************************************************//********************************************************************************* * * * G A T E W A Y R O U T I N E * * * *********************************************************************************/void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){ /* >>>>>>>>>>>>>>>>>> VARIABLE DECLARATIONS <<<<<<<<<<<<<<<<<<< */ matrix *xout, *yout, *x, *u,*init, *v, *w; int a, ny; /* >>>>>>>>>>>>>>>> CHECK FOR PROPER NUMBER OF ARGUMENTS <<<<<<<<<<<<<<< */ if (nrhs!=6) mexErrMsgTxt("Wrong number of input arguments"); else if (nlhs > 2) mexErrMsgTxt("Too many output arguments"); /* >>>>>>>>>>>>>>>>> CONVERT INPUT ARGUMENTS TO SM FORMAT <<<<<<<<<<<<<<<< */ /* Convert "x" */ a=0; if (mxGetN(prhs[a])!=0 && mxGetM(prhs[a])!=0){ x = mat2sm(prhs[a]); xout = mmake(mxGetM(prhs[a]),1); } else mexErrMsgTxt("State vector is empty"); /* Convert "u" */ a=1; if (mxGetN(prhs[a])!=0 && mxGetM(prhs[a])!=0) u = mat2sm(prhs[a]); else u = mmake(1,1); /* Make yout */ a=2; if (mxGetN(prhs[a])!=1 && mxGetM(prhs[a])!=1) mexErrMsgTxt("ny must be scalar"); else{ ny = (int)(*mxGetPr(prhs[a])); yout = mmake(ny,1); } /* Convert "v" */ a=3; if (mxGetN(prhs[a])!=0 && mxGetM(prhs[a])!=0) v = mat2sm(prhs[a]); else v = mmake(1,1); /* Convert "w" */ a=4; if (mxGetN(prhs[a])!=0 && mxGetM(prhs[a])!=0) w = mat2sm(prhs[a]); else w = mmake(1,1); /* Convert "init" */ a=5; if (mxGetN(prhs[a])!=0 && mxGetM(prhs[a])!=0) init = mat2sm(prhs[a]); else init = mmake(1,1); /* Initialize state update and observation functions */ XFUNC(init,x,u,v,-1); YFUNC(init,x,w,-1); printf("\nInitialization performed.\n\n"); printf("Evaluate functions:\n"); XFUNC(xout,x,u,v,0); YFUNC(yout,x,w,0); printf("\nf(x,u,v):\n"); mprint(xout); printf("\n\ng(x,w):\n"); mprint(yout); XFUNC(xout,x,u,v,-2); YFUNC(yout,x,w,-2); printf("\n\nCleaning up performed.\n\n"); /* >>>>>>>>>>>>>>>>>>> CREATE OUTPUT MATICES <<<<<<<<<<<<<<<<<< */ mfree(x); mfree(u); mfree(init); mfree(v); mfree(w); if(nlhs>0){ plhs[0] = mxCreateDoubleMatrix(getrows(yout),1,mxREAL); sm2mat(plhs[0],yout); } if(nlhs>1){ plhs[1] = mxCreateDoubleMatrix(getrows(xout),1,mxREAL); sm2mat(plhs[1],xout); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -