之前准备使用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);
}
}
}
}
}