Matlab中QR分解的C++代码

void QR(double *a,int a_row,int a_colunm,double* q,double *r1)
{
 //QR分解

 int i,j,k,r,m;
 double temp,sum,dr,cr,hr;
 double *ur=new double[a_row*a_row];
 double *pr=new double[a_row*a_row];
 double *wr=new double[a_row*a_row];

 double *q1=new double[a_row*a_row];
 double *emp=new double[a_row*a_row];

 for(i=0;i<a_row;i++)//将a放入temp中

  for(j=0;j<a_colunm;j++)
  {
   emp[i*a_colunm+j]=a[i*a_colunm+j];
  };
 for(i=0;i<a_row;i++)//定义单位矩阵

  for(j=0;j<a_row;j++)
  {
   if(i==j)q[i*a_row+j]=1;

   else q[i*a_row+j]=0;
  };

 for(r=0;r<a_colunm;r++)
 {
  temp=0;

  for(k=r;k<a_row;k++)

   temp+=fabs(a[k*a_colunm+r]);

  if(temp>=0.0)
  {
   sum=0;

   for(k=r;k<a_row;k++)

    sum+=a[k*a_colunm+r]*a[k*a_colunm+r];
   dr=sqrt(sum);
   if(a[r*a_colunm+r]>0.0)m=-1;

   else m=1;
   cr=m*dr;
   hr=cr*(cr-a[r*a_colunm+r]);

   for(i=0;i<a_row;i++)//定义ur
   {
    if(i<r)ur[i]=0;

    if(i==r)ur[i]=a[r*a_colunm+r]-cr;

    if(i>r)ur[i]=a[i*a_colunm+r];
   };

   for(i=0;i<a_row;i++)//定义wr
   {
    sum=0;

    for(j=0;j<a_row;j++)

     sum+=q[i*a_row+j]*ur[j];
    wr[i]=sum;
   };

   for(i=0;i<a_row;i++)//定义qr
    for(j=0;j<a_row;j++)
    {
     q1[i*a_row+j]=q[i*a_row+j]-wr[i]*ur[j]/hr;
    };
   for(i=0;i<a_row;i++)//定义qr+1
    for(j=0;j<a_row;j++)
    {
     q[i*a_row+j]=q1[i*a_row+j];
    };
   for(i=0;i<a_row;i++)//定义pr
   {
    sum=0;
    for(j=0;j<a_row;j++)
     sum+=a[j*a_colunm+i]*ur[j];
    pr[i]=sum/hr;
   };

   for(i=0;i<a_row;i++)
    for(j=0;j<a_colunm;j++)
    {
     a[i*a_colunm+j]=a[i*a_colunm+j]-ur[i]*pr[j];
    };
  };
 };
 for(i=0;i<a_row;i++)
  for(j=0;j<a_colunm;j++)
  {
   if(fabs(a[i*a_colunm+j])<0.0)a[i*a_colunm+j]=0;
  };

 for(i=0;i<a_row;i++)
  for(j=0;j<a_colunm;j++)
  {
   r1[i*a_colunm+j]=a[i*a_colunm+j];
  };

 for(i=0;i<a_row;i++)//将a取出
  for(j=0;j<a_colunm;j++)
  {
   a[i*a_colunm+j]=emp[i*a_colunm+j];
  }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值