C++使用OpenCV实现多元线性回归及求回归系数

C++使用OpenCV实现多元线性回归及求回归系数

之前准备使用Eigen库,但是我需要将C++封装成dll供C#调用,而Eigen是lib编译的,不像OpenCV有编译好的dll方便,因此使用OpenCV的函数解决。

/**
 * @brief : 多元线性回归
 * @param : x, 自变量
 * @param : y, 因变量
 * @param : w, 自变量列数
 * @param : h, 自变量/因变量行数
 * @param : res, 多元线性回归系数
 * @param : precision, 保留小数位
 */
void MultipLelinearRegression(double *x, double *y, int w, int h, double *res, int precision)
{
	cv::Mat xm(h, w, CV_64FC1, x);
	cv::Mat ym(h, 1, CV_64FC1, y);
	cv::Mat coefficients;
	cv::solve(xm, ym, coefficients, cv::DECOMP_NORMAL | cv::DECOMP_LU);

	int rows = coefficients.rows;
	int cols = coefficients.cols;
	if (w == rows * cols)
	{
		std::cout << precision << std::endl;
		int idx = 0;
		double curVal = 0;
		if (precision != -1)
		{
			for (int i = 0; i < rows; i++)
			{
				for (int j = 0; j < cols; j++)
				{
					curVal = coefficients.at<double>(i, j);
					res[idx++] = floor((curVal * pow(10, precision) + 0.5)) / pow(10, precision);
				}
			}
		}
		else 
		{
			for (int i = 0; i < rows; i++)
			{
				for (int j = 0; j < cols; j++)
				{
					res[idx++] = coefficients.at<double>(i, j);
				}
			}
		}
	}
}

你可能感兴趣的:(c++,opencv,线性回归,c#)