一、原理:正态分布降噪的原理为正态分布图,当一个数出现的概率小于0.3%时,便认为其是异常值,并将其去除。
二、 思路:
1.从txt文件中读入数据并将其的值赋值给a数组,并赋值a数组的值给b数组;
2.再新建一个d数组其中存放每个值出现的频率,若重复出现,则其后重复的值全部赋值为0;
3.输出时用d数组中的值分别除以所有值的总数,若小于0.003,则输出b数组中所对应的值,并按照d数组中存放的个数输出;
三、源代码:
#include <iostream>//正态分布降噪
#include<stdio.h>
#include<string.h>
#define n 3940
float a[n] = { 0 };
float d[n] = { 0 };
int main()
{
FILE* fpr, * fpw;
float b[n], c[n], d[n];
double e[n], s;
int i, j, z;
fopen_s(&fpr, "1_1.txt", "r");
fopen_s(&fpw, "1_11.txt", "w");
for (int i = 0; i < n; i++)
fscanf_s(fpr, "%f", &a[i]);
memset(d, 0, sizeof(d));
memset(e, 0, sizeof(e));
for (i = 0; i < n; i++)
b[i] = a[i];
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
if ((a[i] == a[j]) && (a[i] != 0))
d[i] += 1;
s = a[i];
for (z = 0; z < n; z++)
if(abs(s-a[z])<1e-6)
a[z] = 0;
}
for (i = 0; i < n; i++)
if ((d[i] / n) >= 0.003)
fprintf(fpw, "%f\n", b[i]);
return 0;
}