📄 pppppp.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 + -