我对Eigen库有一些问题。当我尝试访问第二个for循环中的矩阵时,我得到了
特征断言指数= 0&& index size()失败
错误虽然我正在调用Matrix的resize函数。
Eigen::Matrix<float, 1, 2> linearRegression(Eigen::Vector2f *p, int pointCount)
{
Eigen::MatrixXf M;
Eigen::Matrix<float, 1, 2> A;
Eigen::MatrixXf Y;
M.resize(pointCount, 2);
Y.resize(pointCount, 1);
for (int i = 0; i < pointCount; i++)
{
M(i, 0) = p[i].x();
M(i, 1) = 1;
Y(i, 0) = p[i].y();
}
A = (M.transpose() * M).inverse() * M.transpose() * Y;
return A;
}
我可以在visual studio调试器中看到矩阵M的成员m_rows
和m_cols
,而i
不会超过它们。该错误直接发生在i = 0
。
MatrixXf
应与Matrix<float, Dynamic, Dynamic>
相同。
当我声明一个常量pointCount并使用固定大小的矩阵时,一切正常。
Eigen::Matrix<float, 1, 2> linearRegression(Eigen::Vector2f *p, int pointCount)
{
const int pointCount = 30;
...
Eigen::Matrix<float, pointCount, 2> M;
Eigen::Matrix<float, 1, 2> A;
Eigen::Matrix<float, pointCount, 1> Y;
...
}
我做错了什么?
答案 0 :(得分:1)
您的表达式(M.transpose() * M).inverse() * M.transpose() * Y
会产生一个包含2行1列的矩阵,而A
则包含1行和2列。由于A
是固定大小,因此调整大小时不会发生。要修复,请在表达式中添加转置:
((M.transpose() * M).inverse() * M.transpose() * Y).transpose()