Matrix类中的getColVector问题

来源:互联网 发布:秦皇岛网络问政平台 编辑:程序博客网 时间:2024/04/30 13:13

1. 原书写作:

int Matrix::GetColVector(int Col,double* pvector)const{
 if(pvector==NULL)
  delete pvector;
 pvector=new double[m_NumRows];//在里面分配
 for (int j=0;j<m_NumRows;j++)
 {
  pvector[j]=GetElement(j,Col);
 }
 return m_NumRows;
}

 

调用时:

 double *pb=NULL;

 //调用时有问题。pb为空(因为是传指针值,返回后为空),

 b.GetColVector(0,pb);

 

2.修改

int Matrix::GetColVector(int Col,double** pvector)const{
 if(pvector==NULL)
  delete pvector;
 *pvector=new double[m_NumRows];
 for (int j=0;j<m_NumRows;j++)
 {
  (*pvector)[j]=GetElement(j,Col);
 }
 return m_NumRows;
}

调用时:

 double *pb=NULL;

//传指针的指针
 b.GetColVector(0,&pb);//在GetColVector里面分配

delete pb;//记得释放

 

 3.完整的mfc的view类方法实现:

//全主元素gauss消去法,写在view类里
int  CNumricAnalysis_zhoucfDlg::gauss(int n,double a[],double b[]){
 int *js,l,k,i,j,is,p,q;
 double d,t;
 js=(int *)malloc(n*sizeof(int));
 l=1;
 for(k=0;k<=n-2;k++){
  d=0.0;
  for(i=k;i<=n-1;i++)
   for(j=k;j<=n-1;j++){
    t=fabs(a[i*n+j]);
    if(t>d)
    {
     d=t;
     js[k]=j;
     is=i;
    }
    
   }
   
   if(d+1.0==1.0)l=0;
   else{
    
    if(js[k]!=k)
     for(i=0;i<=n-1;i++)
     {
      p=i*n+k;q=i*n+js[k];
      t=a[p];a[p]=a[q];a[q]=t;
      
      
     }
     if(is!=k){
      for(j=k;j<=n-1;j++){
       p=k*n+j;q=is*n+j;
       t=a[p];a[p]=a[q];a[q]=t;
      }
      t=b[k];b[k]=b[is];b[is]=t;
     }
   }
   
   
   if(l==0)
   {
    free(js);
    printf("fail\n");
    return 0;
   }
   d=a[k*n+k];
   printf("----d=%f\n",d);
   for(j=k+1;j<=n-1;j++)
   {
    p=k*n+j;a[p]=a[p]/d;
   }
   b[k]=b[k]/d;
  // printf("a[0]=%f,a[1]=%f  b[0]=%f\n",a[0],a[1],b[0]);
  // printf("a[2]=%f,a[3]=%f b[1]=%f\n",a[2],a[3],b[1]);
   for (i=k+1;i<=n-1;i++)
   {
    for (j=k+1;j<=n-1;j++)
    {
     p=i*n+j;
     a[p]=a[p]-a[i*n+k]*a[k*n+j];
  //   printf("b[%d]=%f\n",i,b[i]);
    }
    b[i]=b[i]-a[i*n+k]*b[k];
    
   }
   
   
 }
 d=a[(n-1)*n+n-1];
 if(fabs(d)+1.0==1.0)
 {
  free(js);
  printf("fail\n");
  return 0;
 }
 b[n-1]=b[n-1]/d;
 
 for(i=n-2;i>=0;i--)
 {
  t=0.0;
  for (j=i+1;j<=n-1;j++)
  {
   t=t+a[i*n+j]*b[j];
   
  }
  b[i]=b[i]-t;
 }
 js[n-1]=n-1;
 for (k=n-1;k>=0;k--)
 {
  if(js[k]!=k)
  {
   
   t=b[k];b[k]=b[js[k]];b[js[k]]=t;
  }
 }
 free(js);
 return 1;
 }

void CNumricAnalysis_zhoucfDlg::OnGuass()
{
  UpdateData();
 Matrix a,b,c;
 
 
 //
 
 
 // ::MessageBox(NULL,m_strA,m_strA,MB_OK);
 a.FromString(m_strA);
 b.FromString(m_strB);
 double *pb=NULL;//(double*)malloc(b.GetNumCols()*sizeof(double));
 b.GetColVector(0,&pb);
// char* ss=ftoa(1,pb[1]);
 if(pb!=NULL)
 {

 
  ::MessageBox(NULL,"pb","",2);
}
 double *pa=a.GetData();
 if(pa!=NULL)
 {
  
  
  ::MessageBox(NULL,"pa","pa not null",2);
}

///调用
this->gauss(a.GetNumCols(), pa,pb);

char tmp[100];
memset(tmp,0,100);
CString ss;
for(int m=0;m<b.GetNumCols();m++)
{
 
 sprintf(&tmp[10*m],"%10.5f,",pb[m]);
 //ss+=
}

::MessageBox(NULL,tmp,"result is x=",2);
}

 

操作例图:

原创粉丝点击