代码实现如下:
#include<iostream>
#include<Eigen\dense>
#include<vector>
using namespace std;
using namespace Eigen;
double MahalanobisDistance::mahalanobis_distance(vector<double> data, vector<double> vector_x, vector<double> vector_y)
//第一个参数是所有向量样本的值的有序排列。
{
int n = vector_x.size();//n确定维度
vector<vector<double>> datas;
for (int i = 0; i < n; i++)
{
vector<double>data_arr;
datas.push_back(data_arr);
}
//将所有的数据按向量的维度分类
for (int i = 0; i < n; i++)
{
for (int j = i; j < data.size(); j += n)
{
datas[i].push_back(data[j]);
}
}
VectorXd sum, mean(n);
sum.setZero(n);
//每个维度求和
for (int i = 0; i < n; i++)
for (int j = 0; j < data.size() / n; j++)
{
sum(i) += datas[i][j];
}
mean = sum / datas[0].size();//每个维度的均值
//求协方差矩阵
MatrixXd cov;
cov.setZero(n, n);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
for (int k = 0; k < data.size() / n; k++)
{
cov(i, j) = cov(i, j) + (datas[i][k] - mean[i]) * (datas[j][k]
- mean[j]);
}
cov = cov / (data.size() / n - 1);
//单个数据点的马氏距离
if (vector_y.size() == 0)
{
MatrixXd mm(n, 1);
for (int i = 0; i < n; i++)
{
mm(i) = vector_x[i] - mean(i);
}
MatrixXd temp(0, 0);
temp = mm.transpose() * cov.inverse() * mm;
return sqrt(temp(0, 0));
}
//两个数据点之间的马氏距离
else
{
MatrixXd mm(n, 1);
for (int i = 0; i < n; i++)
{
mm(i) = vector_x[i] - vector_y[i];
}
MatrixXd temp(0, 0);
temp = mm.transpose() * cov.inverse() * mm;
return sqrt(temp(0, 0));
}
}