C++归一化代码,matrix与vector转换

发布时间 2023-08-08 14:40:05作者: akaS

一、C++项目移植

1 归一化以及反归一化

1.1 对vector归一化

vector<double> normalize(vector<double>& data)//归一化,输入一组数据,遍历取出最大值与最小值,然后进行计算
{
	double minvalue = data[0];
	double maxvalue = data[0];
	for (int i = 0; i < data.size(); i++)
	{
		if (minvalue > data[i])
		{
			minvalue = data[i];
		}

		if (maxvalue < data[i])
		{
			maxvalue = data[i];
		}
	}

	double range = maxvalue - minvalue;
	for (int j = 0; j < data.size(); j++)
	{
		data[j] = (data[j] - minvalue) / range;
	}
	return { maxvalue , minvalue };
}

1.2 对matrix归一化

vector<double> normalize_matrix(vector<vector<double>>& matrix)
{
	double maxvalue = matrix[0][0];
	double minvalue = matrix[0][0];

	for (const auto& row : matrix)
	{
		for (const auto& value : row)
		{
			minvalue = min(minvalue, value);
			maxvalue = max(maxvalue, value);
		}
	}

	double range = maxvalue - minvalue;
	vector<vector<double>> normalize_matrix(matrix.size(), vector<double>(matrix[0].size(), 0));

	for (int i = 0; i < matrix.size(); i++)
	{
		for (int j = 0; j < matrix[i].size(); j++)
		{
			matrix[i][j] = (matrix[i][j] - minvalue) / range;
		}
	}
	return { minvalue,maxvalue };
}

1.3 对vector反归一化

vector<double> retorenormalize(vector<double>& data, double maxvalue, double minvalue)//反归一化,输入归一化后数据以及原始最大值与最小值,输出原始数据
{
	vector<double> originaldata = {0.0};
	originaldata.resize(data.size());
	for (int i = 0; i < data.size(); i++)
	{
		originaldata[i] = data[i] * (maxvalue - minvalue) + minvalue;
	}

	return originaldata;
}

1.4 对matrix反归一化

vector<vector<double>> retorenormalize_matrix(vector<vector<double>>& matrix, double maxvalue, double minvalue)
{
	int rows = 3;
	int cols = 5;
	vector<vector<double>> original_matrix(rows,vector<double>(cols,0.0));
	for (int i = 0; i < matrix.size(); i++)
	{
		for (int j = 0; j < matrix[i].size(); j++)
		{
			original_matrix[i][j] = matrix[i][j] * (maxvalue - minvalue) + minvalue;
		}
	}
	return original_matrix;
}

2 vector——matrix转换

vector<vector<double>> convertFloatToDouble(float* datanew, int rows, int cols) {
    vector<std::vector<double>> date(rows, std::vector<double>(cols));
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            date[i][j] = static_cast<double>(datanew[i * cols + j]);
        }
    }

    return date;
}

3 模型选择

后续继续填坑