Chinaunix首页 | 论坛 | 博客
  • 博客访问: 608840
  • 博文数量: 72
  • 博客积分: 1177
  • 博客等级: 少尉
  • 技术积分: 856
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-23 23:03
文章分类

全部博文(72)

文章存档

2015年(13)

2014年(5)

2013年(7)

2012年(39)

2011年(8)

分类: 虚拟化

2015-03-18 15:46:26

理论推导过程:

求矩阵即可得到m,n,x0,y0,直线方程的各个参数即为所得。
#include
#include
#include
#include
#define MAX 10
#define PtSum 38
#define MTX_AMT 100


void Inverse(double *matrix1[],double *matrix2[],int n,double d);
double Determinant(double* matrix[],int n);
double AlCo(double* matrix[],int jie,int row,int column);
double Cofactor(double* matrix[],int jie,int row,int column);
void Empty(double *matrix[],int row,int column);


int main(int argc, CHAR* argv[])
{
    double array[MTX_AMT][3],*Matrix[2],*IMatrix[2];//允许有MTX_AMT个点
    //设定待拟合的直线(x -1)/3 = (y - 2)/2 = z/1
    //x = 3z + 1
    //y = 2z + 2
    for (int i = 0; i < PtSum;i++)
    {
        array[i][2] = (double)i; 
        array[i][0] = 3*array[i][2] + 1 + rand()/RAND_MAX;  //引入噪声
        array[i][1] = 2*array[i][2] + 2 + rand()/RAND_MAX;  //引入噪声
    }
    double X0,Y0,m,n;//这是待拟合的四个参数,已知分别对应:1、2、3、2现在我们来拟合
    for ( i = 0;i < 2;i++)
    {
        Matrix[i] =  new double[2];
        IMatrix[i] = new double[2];
    }
    Empty(Matrix,2,2);//将矩阵的前两行两列置位0


    for (int j = 0;j < PtSum;j++)//
    {
        *(Matrix[0] + 0) += array[j][2]*array[j][2];//Matrix[0][0]=array[0][2]*array[0][2]=z*z
        *(Matrix[0] + 1) += array[j][2];//Matrix[0][1]=array[0][2]=z
    }
    *(Matrix[1] + 0) = *(Matrix[0] + 1);//Matrix[1][0]=z;
    *(Matrix[1] + 1) = 1.0*PtSum;//Matrix[1][1]=n;


//下面两步是求Matrix的逆矩阵并存到IMatrix中
//A^(-1)=(1/|A|)×A* ,其中A^(-1)表示矩阵A的逆矩阵,其中|A|为矩阵A的行列式,A*为矩阵A的伴随矩阵。
    double d = Determinant(Matrix,2);
    Inverse(Matrix,IMatrix,2,d);//反转存到IMatrix中


    Empty(Matrix,2,2);
    for ( i = 0;i < PtSum;i++)
    {
        *(Matrix[0] + 0) += array[i][0]*array[i][2];//xi*zi的和
        *(Matrix[0] + 1) += array[i][0];//xi
        *(Matrix[1] + 0) += array[i][1]*array[i][2];//yi*zi的和
        *(Matrix[1] + 1) += array[i][1];//yi
    }
    m = *(Matrix[0] + 0)**(IMatrix[0] + 0) + *(Matrix[0] + 1)**(IMatrix[1] + 0);
    X0= *(Matrix[0] + 0)**(IMatrix[0] + 1) + *(Matrix[0] + 1)**(IMatrix[1] + 1);
    n = *(Matrix[1] + 0)**(IMatrix[0] + 0) + *(Matrix[1] + 1)**(IMatrix[1] + 0);
    Y0= *(Matrix[1] + 0)**(IMatrix[0] + 1) + *(Matrix[1] + 1)**(IMatrix[1] + 1);
    printf("%5.2f\t%5.2f\t%5.2f\t%5.2f\t",X0,Y0,m,n);
    for ( i = 0;i < 2;i++)
    {
        delete[] Matrix[i];
        delete[] IMatrix[i];
    }
    getchar();
    return 0;
}


void Empty(double *matrix[],int row,int column)//初始化
{
    for (int i = 0;i < row;i++)
    {
        for (int j = 0;j < column;j++)
        {
            *(matrix[i] + j) = 0.0;
        }
    }
}


void Inverse(double *matrix1[],double *matrix2[],int n,double d) //

    int i,j; 
    for(i=0;i         matrix2[i]=(double *)malloc(n*sizeof(double)); //给IMatrix一维指针分配空间
    for(i=0;i         for(j=0;j             *(matrix2[j]+i)=(AlCo(matrix1,n,i,j)/d); //给IMatrix二维数据分配空间



double Determinant(double* matrix[],int n) // 计算行列式
{  
    double result=0,temp;  
    int i;  
    if(n == 1)  
        result=(*matrix[0]);  
    else  
    {  
        for(i=0;i         {  
            temp=AlCo(matrix,n,n-1,i);  
            result+=(*(matrix[n-1]+i))*temp;  
        }  
    }  
    return result;  
}  


double AlCo(double* matrix[],int jie,int row,int column)  //
{  
    double result; 
    if((row+column)%2 == 0) //如果不是偶数倍
        result = Cofactor(matrix,jie,row,column);  
    else result=(-1)*Cofactor(matrix,jie,row,column); 
    return result;  
}  


double Cofactor(double* matrix[],int jie,int row,int column)  
{  
    double result;  
    int i,j;  
    double* smallmatr[MAX-1];  
    for(i=0;i         smallmatr[i]= new double[jie - 1];//n*n矩阵
    for(i=0;i         for(j=0;j             *(smallmatr[i]+j)=*(matrix[i]+j);  //给smallmatr赋值
    for(i=row;i         for(j=0;j             *(smallmatr[i]+j)=*(matrix[i+1]+j);  
    for(i=0;i         for(j=column;j             *(smallmatr[i]+j)=*(matrix[i]+j+1);  
    for(i=row;i         for(j=column;j             *(smallmatr[i]+j)=*(matrix[i+1]+j+1);  
    result = Determinant(smallmatr,jie-1); 
    for(i=0;i         delete[] smallmatr[i];
    return result;   


阅读(5695) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~