求大神指教卡尔曼滤波算法C 程序中的"rinv.c"函数在哪里

Tigertrisword 2015-10-08 11:57:52

下面是在网上下载的卡尔曼滤波算法的C程序,做了部分修改。由于找不到“rinv.c”,无法正常编译。求知情者告知此rinv的函数原型。万谢!
#include "stdlib.h"

#include "rinv.c"
/*int lman(n,m,k,f,q,r,h,y,x,p,g)
int n,m,k;
double f[],q[],r[],h[],y[],x[],p[],g[]; */



int lman(int n,int m,int k,double f[],double q[],double r[],double h[],double y[],double x[],double p[],double g[])

{
int i,j,kk,ii,l,jj,js;
double *e,*a,*b;

//e= malloc(m*m*sizeof(double)); //void * __cdecl malloc(size_t); malloc函数的返回值是void 类型
e=(double*)malloc(m*m*sizeof(double));
l=m;
if (l<n) l=n;
//a= malloc(l*l*sizeof(double));
//b= malloc(l*l*sizeof(double));
a= (double*)malloc(l*l*sizeof(double));
b=(double*)malloc(l*l*sizeof(double));

for (i=0; i<=n-1; i++)
for (j=0; j<=n-1; j++)
{ ii=i*l+j; a[ii]=0.0;
for (kk=0; kk<=n-1; kk++)
a[ii]=a[ii]+p[i*n+kk]*f[j*n+kk];
}
for (i=0; i<=n-1; i++)
for (j=0; j<=n-1; j++)
{ ii=i*n+j; p[ii]=q[ii];
for (kk=0; kk<=n-1; kk++)
p[ii]=p[ii]+f[i*n+kk]*a[kk*l+j];
}
for (ii=2; ii<=k; ii++)
{ for (i=0; i<=n-1; i++)
for (j=0; j<=m-1; j++)
{ jj=i*l+j; a[jj]=0.0;
for (kk=0; kk<=n-1; kk++)
a[jj]=a[jj]+p[i*n+kk]*h[j*n+kk];
}
for (i=0; i<=m-1; i++)
for (j=0; j<=m-1; j++)
{ jj=i*m+j; e[jj]=r[jj];
for (kk=0; kk<=n-1; kk++)
e[jj]=e[jj]+h[i*n+kk]*a[kk*l+j];
}
js=rinv(e,m);
if (js==0)
{ free(e); free(a); free(b); return(js);}
for (i=0; i<=n-1; i++)
for (j=0; j<=m-1; j++)
{ jj=i*m+j; g[jj]=0.0;
for (kk=0; kk<=m-1; kk++)
g[jj]=g[jj]+a[i*l+kk]*e[j*m+kk];
}
for (i=0; i<=n-1; i++)
{ jj=(ii-1)*n+i; x[jj]=0.0;
for (j=0; j<=n-1; j++)
x[jj]=x[jj]+f[i*n+j]*x[(ii-2)*n+j];
}
for (i=0; i<=m-1; i++)
{ jj=i*l; b[jj]=y[(ii-1)*m+i];
for (j=0; j<=n-1; j++)
b[jj]=b[jj]-h[i*n+j]*x[(ii-1)*n+j];
}
for (i=0; i<=n-1; i++)
{ jj=(ii-1)*n+i;
for (j=0; j<=m-1; j++)
x[jj]=x[jj]+g[i*m+j]*b[j*l];
}
if (ii<k)
{ for (i=0; i<=n-1; i++)
for (j=0; j<=n-1; j++)
{ jj=i*l+j; a[jj]=0.0;
for (kk=0; kk<=m-1; kk++)
a[jj]=a[jj]-g[i*m+kk]*h[kk*n+j];
if (i==j) a[jj]=1.0+a[jj];
}
for (i=0; i<=n-1; i++)
for (j=0; j<=n-1; j++)
{ jj=i*l+j; b[jj]=0.0;
for (kk=0; kk<=n-1; kk++)
b[jj]=b[jj]+a[i*l+kk]*p[kk*n+j];
}
for (i=0; i<=n-1; i++)
for (j=0; j<=n-1; j++)
{ jj=i*l+j; a[jj]=0.0;
for (kk=0; kk<=n-1; kk++)
a[jj]=a[jj]+b[i*l+kk]*f[j*n+kk];
}
for (i=0; i<=n-1; i++)
for (j=0; j<=n-1; j++)
{ jj=i*n+j; p[jj]=q[jj];
for (kk=0; kk<=n-1; kk++)
p[jj]=p[jj]+f[i*n+kk]*a[j*l+kk];
}
}
}
free(e); free(a); free(b);
return(js);
}
...全文
1232 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
青竹的镜子 2016-09-29
  • 打赏
  • 举报
回复
这是一本书的实例代码修改而来的程序,rinv.c文件其实是同一本书矩阵求逆函数rinv(double*, int)的代码文件……
qq_35610482 2016-07-15
  • 打赏
  • 举报
回复
兄弟搞定没 能不能教教我

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧