cpp编程实现knn均值滤波算法
时间: 2023-10-22 14:21:16 浏览: 97
以下是使用C++实现knn均值滤波算法的示例代码:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 计算欧几里得距离
double euclideanDistance(vector<double>& vec1, vector<double>& vec2) {
double distance = 0.0;
for (int i = 0; i < vec1.size(); i++) {
distance += pow(vec1[i] - vec2[i], 2);
}
return sqrt(distance);
}
// 均值滤波函数
vector<double> knnMeanFilter(vector<vector<double>>& data, int k) {
vector<double> result;
for (int i = 0; i < data[0].size(); i++) {
vector<double> distList;
for (int j = 0; j < data.size(); j++) {
vector<double> vec1 = data[j];
vec1.erase(vec1.begin() + i);
for (int m = j + 1; m < data.size(); m++) {
vector<double> vec2 = data[m];
vec2.erase(vec2.begin() + i);
double distance = euclideanDistance(vec1, vec2);
distList.push_back(distance);
}
}
sort(distList.begin(), distList.end());
vector<double> valueList;
for (int j = 0; j < k; j++) {
double value = data[j / (data.size() - 1)][i];
valueList.push_back(value);
}
double sum = 0.0;
for (int j = 0; j < valueList.size(); j++) {
sum += valueList[j];
}
double mean = sum / valueList.size();
result.push_back(mean);
}
return result;
}
int main() {
// 原始数据
vector<vector<double>> data = { {1.2, 2.4, 3.6, 4.8}, {2.4, 3.6, 4.8, 6.0}, {3.6, 4.8, 6.0, 7.2}, {4.8, 6.0, 7.2, 8.4} };
// k值
int k = 3;
// 均值滤波结果
vector<double> result = knnMeanFilter(data, k);
// 输出结果
for (int i = 0; i < result.size(); i++) {
cout << result[i] << " ";
}
cout << endl;
return 0;
}
```
在上述示例代码中,首先定义了一个计算欧几里得距离的函数`euclideanDistance`,然后定义了一个均值滤波函数`knnMeanFilter`,该函数接收原始数据和k值作为参数,返回均值滤波后的结果。在函数内部,首先遍历每一个数据列,然后计算该列中每两个不同数据之间的距离,并将这些距离存储在`distList`中。接着,将`distList`中的距离从小到大排序,并取出前k个距离对应的数据值。最后,将这些数据值取平均作为该列的均值滤波结果,并将结果存储在`result`中。
在主函数中,定义了一个4x4的原始数据数组,k值为3,调用`knnMeanFilter`函数进行均值滤波,并输出结果。
阅读全文