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);
}
操作例图: