在研究zernike多项式过程中,需要使用到矩阵的最小二乘拟合。所以在这里记录分享Eigen库的最小二乘拟合使用方法。
最小二乘公式
B:n×1矩阵
X : m × n 矩 阵 , 输 入 变 量 / 特 征 X:m \times n 矩阵,输入变量/特征X:m×n矩阵,输入变量/特征
Y : m × 1 矩 阵 , 输 出 变 量 / 拟 合 目 标 Y:m \times 1 矩阵,输出变量/拟合目标Y:m×1矩阵,输出变量/拟合目标
m : 样 本 数 m:样本数m:样本数
n : 特 征 个 数 n:特征个数n:特征个数
Eigen实现
如一组样本数为3、特征数为3的矩阵,进行最小二乘拟合如下,
1 // 初始化
2 MatrixXf X(3, 3);
3 MatrixXf Y(3, 1);
4 X <<
5 3, 1, 2,
6 3, 2, 4,
7 5, 5, 2;
8 Y <<
9 2,
10 2,
11 3;
12 // 最小二乘拟合
13 MatrixXf Xt = X.transpose();
14 MatrixXf B = (Xt*X).inverse()*Xt*Y;
15 // 检验
16 MatrixXf Yfit = X*B;
17 // 显示
18 cout << "X = " << endl << X << endl << endl;
19 cout << "Y = " << endl << Y << endl << endl;
20 cout << "B = " << endl << B << endl << endl;
21 cout << "Yfit = " << endl << Yfit << endl << endl;
对应的MATLAB计算方法如下
1 X = [3,1,2; 3,2,4; 5,5,2]
2 Y = [2; 2; 3]
3
4 B = inv(X'*X)*X'*Y % 也可以写作 B = (X'*X)\X'*Y
5
6 Yfit = X*B
结果对比如下,结果一致,ok
其他
- 使用之前当然要先加入头文件
1 #include <Eigen/Dense>
2 using namespace Eigen;
- 上文C代码中我使用手动赋值的方式,其实对于大矩阵还可以使用循环赋值,如下
1 float a[9] = {3, 1, 2, 3, 2, 4, 5, 5, 2};
2 MatrixXf X(3 ,3);
3 for (int i = 0; i < 3; i++)
4 for (int j = 0; j < 3; j++)
5 X(i, j) = a[i * 3 + j];
6
7 cout << "X = " << endl << X << endl << endl;
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
2021-07-06 C++ delete指针以后应赋值为NULL
2020-07-06 Qt Qchart 中清空绘图
2020-07-06 Qt QChartView 如何放入widget