声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2290|回复: 1

[C/C++] [求助]各位大侠帮我看看我的程序有什么问题啊

[复制链接]
发表于 2006-6-6 11:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
<P>我在做卡尔曼滤波器的基本软件。有个求矩阵逆的地方,我用了全选主元高斯约当法。可4阶方阵还能出个结果(但结果不对);到了5阶,编译时依然没错,就是运行时老出“can't run target cpu”之类到话。我用到是DSP的软件CCS,c6701 simulater map1各位高手帮我看看吧,先谢谢了!!!<BR><BR>#include "stdio.h"<BR>#define N 5//矩阵维数<BR>extern int dcinv(double a[],int n);</P>
<P>void main()<BR>{<BR> int i,j;<BR> /*static double x[N*N]={1,0,0,0,0,0,<BR>                       0,1,0,0,0,0,<BR>                       0,0,1,0,0,0,<BR>                       0,0,0,1,0,0,<BR>                       0,0,0,0,1,0,<BR>                       0,0,0,0,0,1};*/<BR> static double x[N*N]={0,0,0,1,2,<BR>                       0,0,0,2,3,<BR>                       1,1,0,0,0,<BR>                       0,1,1,0,0,<BR>                       0,0,1,0,0,};<BR> /*inverse of x=0  0 1 -1  1<BR>             0  0 0  1 -1<BR>             0  0 0  0  1<BR>             -3 2 0  0  0<BR>             2 -1 0  0  0*/<BR> /*double x[N*N]={3,-2,0,0,<BR>                5,-3,0,0,<BR>                0, 0,3,4,<BR>                0, 0,1,1};*/<BR> /*inverse of x=-3  2  0 0 <BR>                -5  3  0 0 <BR>                 0  0 -1 4<BR>                 0  0  1 -3*/<BR> double y[N*N];<BR> for(i=0;i&lt;N;i++)<BR>  for(j=0;j&lt;N;j++)<BR>   y[i*N+j]=x[i*N+j]; <BR> printf("begin\n");<BR> i=dcinv(x,N);<BR> printf("end\n");<BR> if(i!=0)<BR>  {<BR>  printf("mat x is:\n");<BR>  for(i=0;i&lt;N;i++)<BR>   {<BR>   for(j=0;j&lt;N;j++)<BR>    printf("%e  ",y[i*N+j]);<BR>   printf("\n");<BR>   }<BR>  printf("\n");<BR>  <BR>  printf("mat x-1 is:\n");<BR>  for(i=0;i&lt;N;i++)<BR>   {<BR>   for(j=0;j&lt;N;j++)<BR>    printf("%e  ",x[i*N+j]);<BR>   printf("\n");<BR>   }<BR>  printf("\n");<BR>  }<BR>}</P>

<P><BR> </P>
回复
分享到:

使用道具 举报

 楼主| 发表于 2006-6-6 11:15 | 显示全部楼层
<P>这是求逆子函数<BR>#include "stdio.h"<BR>#include "math.h"<BR>#include "stdlib.h"</P>
<P>int dcinv(double a[],int n)<BR>{<BR>int *is,*js,i,j,k,l,u,v;<BR>double d,p;<BR>is=malloc(n*sizeof(int));<BR>js=malloc(n*sizeof(int));<BR>for(k=0;k&lt;=n-1;k++)<BR> {<BR> d=0.0;<BR> for(i=k;i&lt;=n-1;i++)<BR> for(j=k;j&lt;=n-1;j++)<BR>  {l=i*n+j;<BR>  p=fabs(a[l]);<BR>  if(p&gt;d){d=p;is[k]=i;js[k]=j;}<BR>  }<BR>  /*选出第k行第k列的右下角子阵中绝对值最大<BR>  的元素,放入d中,并将此元素的行列号存入<BR>  is[k]、js[k]中*/<BR> if(d+1.0==1.0)<BR>  {free(is);free(js);printf("err**not inv\n");<BR>  return(0);<BR>  }<BR>  /*若A为奇异矩阵,则求逆失败,返回错误信息*/<BR> if(is[k]!=k)<BR>  for(j=0;j&lt;=n-1;j++)<BR>   {u=k*n+j;v=is[k]*n+j;<BR>   p=a;a=a[v];a[v]=p;<BR>   }//行交换<BR> if(js[k]!=k)<BR>  for(i=0;i&lt;=n-1;i++)<BR>   {u=i*n+k;v=i*n+js[k];<BR>   p=a;a=a[v];a[v]=p;<BR>   }//列交换<BR> /*通过行交换列交换将最大绝对值元素换到主元素位置上*/  <BR> l=k*n+k;<BR> a[l]=1.0/a[l];<BR> /*a[k][k]=1/a[k][k]*/<BR> for(j=0;j&lt;=n-1;j++)<BR>  if(j!=k)<BR>   {u=k*n+j;a=a*a[v];}<BR> /*a[k][j]=a[k][j]*a[k][k]*/<BR> for(i=0;i&lt;=n-1;i++)<BR>  if(i!=k)<BR>   for(j=0;j&lt;=n-1;j++)<BR>    if(j!=k)<BR>     {u=i*n+j;<BR>     a=a-a[i*n+k]*a[k*n+j];<BR>     }<BR> /*a[j]=a[j]-a[k]*a[k][j]*/<BR> for(i=0;i&lt;=n-1;i++)<BR>  if(i!=k)<BR>   {u=i*n+k;a=-a*a[l];<BR>   }<BR> /*a[k]=-a[k]*a[k][k]*/<BR> /*for(i=0;i&lt;=n-1;i++)  <BR>  for(j=0;j&lt;=n-1;j++)<BR>   printf("a[%n][%n]=%e  ",i,j,a[i*n+j]);<BR>  printf("\n");*/<BR> }<BR>for(k=n-1;k&gt;=0;k--)<BR> {if(js[k]!=k)<BR>  for(j=0;j&lt;=n-1;j++)<BR>   {u=k*n+j;v=js[k]*n+j;<BR>   p=a;a=a[v];a[v]=p;<BR>   }<BR> if(is[k]!=k)<BR>  for(i=0;i&lt;=n-1;i++)<BR>   {u=i*n+k;v=i*n+is[k];<BR>   p=a;a=a[v];a[v]=p;<BR>   }<BR> }<BR>free(is);<BR>free(js);<BR>return(1);<BR>}</P>
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-11 14:23 , Processed in 0.057495 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表