数学建模之数据的标准化处理(C语言)

在此我将主要编译两种数据的标准化方法。
1.极差标准化处理
(1)、采用公式很简单,以下:
在这里插入图片描述
(2)、话很少说,上代码:ios

#include <iostream>
#define n 3//实际问题需改动
#define m 5//实际问题需改动
void max(float a[][n], float b[], float c[]);
int main()
{
	FILE* fpr, * fpw;
	fopen_s(&fpr, "1.txt", "r");
	fopen_s(&fpw, "2.txt", "w");
	float a[m][n], b[n][m], minn[n], maxx[n];
	for (int i = 0; i < m; i++)//读取数据
		for (int j = 0; j < n; j++)
			fscanf_s(fpr, "%f", &a[i][j]);
	for (int j = 0; j < n; j++)//针对问题需改动,此示例问题全部数据均为逆指标(取倒数)
		for (int i = 0; i < m; i++)
			a[i][j] = 1.0 / a[i][j];
	max(a, maxx, minn);//求最值
	for (int j = 0; j < n; j++)//极差标准化处理
		for (int i = 0; i < m; i++)
			a[i][j] = (a[i][j] - minn[j]) / (maxx[j] - minn[j]);
	for (int j = 0; j < m; j++)//输出结果
	{
		for (int i = 0; i < n; i++)
			fprintf(fpw,"%f  ", a[j][i]);
		fprintf(fpw, "\n");
	}
	return 0;
}
void max(float a[][n], float b[], float c[])//求最大及最小值
{
	for (int i = 0; i < n; i++)
		b[i] = c[i] = a[0][i];
	for (int j = 0; j < n; j++)
		for (int i = 0; i < m; i++)
		{
			if (a[i][j] > b[j])
				b[j] = a[i][j];
			if (a[i][j] < c[j])
				c[j] = a[i][j];
		}
}

2.z-score 0均值标准化
(1)、公式以下所示(x是原始数据,u是样本均值,σ是样本标准差):
在这里插入图片描述
(2)、源代码(emmmmm由于嫌麻烦因此就只写了核心代码):web

for (int j = 0; j < n; j++)//求各列之和
		for (int i = 0; i < m; i++)
			sum += a[i][j];
aver = sum / (n * m);
for (int j = 0; j < n; j++)
	for (int i = 0; i < m; i++)
		c += abs((a[i][j] - aver) * (a[i][j] - aver) / (n * m));
r = sqrt(c);//标准差求解
for (int j = 0; j < n; j++)//归一化处理(z-score 0均值标准化)
	for (int i = 0; i < m; i++)
		a[i][j] = (a[i][j]-aver) / r;