⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pppppp.cpp

📁 计算欧氏距离和马式距离的程序
💻 CPP
字号:
#include <iostream>
#include <cmath>
#include <assert.h>

using namespace std;

// 实现欧氏距离的计算
double Oshi(double x[],double y[], size_t xlen, size_t ylen)
{
	assert(xlen == ylen);
	int length=xlen;

	double ODistance=0;
	for(int i=0;i<length;i++ )
	{
		ODistance=ODistance+(x[i]-y[i])*(x[i]-y[i]);
	}
	ODistance=ODistance/length;
	ODistance=sqrt(ODistance);
	return ODistance;
}


//实现玛氏距离的计算

double Mashi(double x[],double y[],double **cov,int len)
{   
	//申请空间
	int i,j;
	int length=len;
	double Dis=0.0;
	
	double *Z=new double[length];
	double *T=new double[length];

	for(i=0;i<length;i++)
		T[i]=0;

	//计算马氏距离
	for(i=0;i<length;i++)
	{
		Z[i]=x[i]-y[i];
	
	}
    i=0;
    for(j=0;j<length;j++)			
	{
		for(int k=0;k<length;k++)
		T[i]+=Z[k]*cov[k][j];
		i+=1;
	}
    
	for(i=0;i<length;i++)
			Dis+=T[i]*Z[i];
	Dis=sqrt(Dis);

	delete Z;
	Z=NULL;
	delete T;
	T=NULL;
	
	return Dis;
} 

/*
void matrix(int b[][X],int c[][Y])//求矩阵的乘积
{
int i,j,k,temp;
for(i=0;i<X;i++)
for(j=0;j<Y;j++){
for(k=0;k<Y;k++)
a[i][j]+=b[i][k]*c[k][j];
}
}
*/


double Surplus(double A[],int m,int n);  //求矩阵的行列式
double * MatrixInver(double A[],int m,int n); //矩阵转置
double * MatrixOpp(double A[],int m,int n); /*矩阵求逆*/  

//求协方差矩阵及其逆矩阵
double **Xiefangcha(double **in,double **out,int lenx,int leny)
{
	assert(lenx>1 && leny>1 );
	int i,j;	
    int L=lenx,H=leny;
    double *X_=new double(H);//存放各分量的平均值
	double *D_=new double(H);//存放各分量的方差
	double Exy_t=0.0;
	for(i=0;i<H;i++)
	{
		X_[i]=0.0;
		D_[i]=0.0;
	}
	//求分量的平均值、方差
	for(j=0;j<H;j++)
		for(i=0;i<L;i++)		
		{
			X_[j]+=in[i][j];
		}
    for(j=0;j<H;j++)
		X_[j]/=L;
    for(j=0;j<H;j++)
		for(i=0;i<L;i++)
		{
			D_[j]=(in[i][j]-X_[j])*(in[i][j]-X_[j]);
		}
	for(j=0;j<H;j++)
	{
		D_[j]/=L;
		D_[j]=sqrt(D_[j]);
	}
	
	//求协方差矩阵
	for(i=0;i<H;i++)
		for(j=0;j<H;j++)
		{
			if(i==j)
				out[i][j]=D_[i];
			else
			{
               for(int k=0;k<L;k++)				   
			   {
				   for(int m=0;m<L;m++)
				      Exy_t+=in[k][i]*in[m][j]	;
			   }
				Exy_t/=L*L;
				out[i][j]=Exy_t-X_[i]*X_[j];
			}

		}

    //求协方差矩阵的逆矩阵
    
    delete [] D_;
	D_=NULL;
    delete [] X_;
	X_=NULL;
	return NULL;
}

double Surplus(double A[],int m,int n) /*求矩阵行列式*/  
 {  
  
 
	int i,j,k,p,r;  
	double X,temp=1,temp1=1,s=0,s1=0;  
  
	if(n==2)  
	{
		for(i=0;i<m;i++)  
		for(j=0;j<n;j++)  
		if((i+j)%2) temp1*=A[i*n+j];  
		else temp*=A[i*n+j];  
		X=temp-temp1;
	}  
	else
	{ 
		
		for(k=0;k<n;k++)  
		{
		
			for(i=0,j=k;i<m,j<n;i++,j++)  
				temp*=A[i*n+j];  
			if(m-i)  
			{

				for(p=m-i,r=m-1;p>0;p--,r--)  
				temp*=A[r*n+p-1];
			}  
		s+=temp;  
		temp=1;  
	}  
  
	for(k=n-1;k>=0;k--)  
	{

		for(i=0,j=k;i<m,j>=0;i++,j--)  
		temp1*=A[i*n+j];  
		if(m-i)  
		{
			for(p=m-1,r=i;r<m;p--,r++)  
			temp1*=A[r*n+p];}  
			s1+=temp1;  
			temp1=1;  
		}  
  
	X=s-s1;
	}  
	return X; 
 
 } 


double * MatrixInver(double A[],int m,int n) /*矩阵转置*/  
 {  
	int i,j;  
	double *B=NULL;  
	B=(double *)malloc(m*n*sizeof(double));  
  
	for(i=0;i<n;i++)  
		for(j=0;j<m;j++)  
			B[i*m+j]=A[j*n+i];  
  
	return B;  
 }


double * MatrixOpp(double A[],int m,int n) /*矩阵求逆*/  
{  
	int i,j,x,y,k;  
	double *SP=NULL,*AB=NULL,*B=NULL,X,*C;  
	SP=(double *)malloc(m*n*sizeof(double));  
	AB=(double *)malloc(m*n*sizeof(double));  
	B=(double *)malloc(m*n*sizeof(double));  
  
	X=Surplus(A,m,n);  
	X=1/X;  
  
	for(i=0;i<m;i++)  
		for(j=0;j<n;j++)  
		{
			for(k=0;k<m*n;k++)  
			B[k]=A[k];  
			{
				for(x=0;x<n;x++)  
				B[i*n+x]=0;  
				for(y=0;y<m;y++)  
				B[m*y+j]=0;  
				B[i*n+j]=1;  
				SP[i*n+j]=Surplus(B,m,n);  
				AB[i*n+j]=X*SP[i*n+j];  
			}  
		}  
	C=MatrixInver(AB,m,n);  
  
	return C;  
 }  
  
int main(void)
{
	double a[3]={11.0,2.3,3.4};
	double b[3]={2.1,15.8,9.54};
	double kk;
	kk=Oshi(a,b, 3, 3);
	cout<<"kk= "<<kk<<endl;
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -