我试图为具有Eigen的任何大小的矩阵实现阻尼伪逆函数。我不明白为什么这个实现不起作用。
功能:
template<typename Derived>
Derived dampedPinv(const Eigen::MatrixBase<Derived>& a, double rho = 1e-4) {
return a.transpose() * (a*a.transpose() + rho*rho*Eigen::MatrixBase<Derived>::Identity(a.rows(), a.rows()) ).inverse();
}
函数调用:
Eigen::MatrixXd a = Eigen::MatrixXd::Zero(6,1);
a(3,0) = 1;
Eigen::MatrixXd ainv = Eigen::MatrixXd::Zero(6,1);
ainv = dampedPinv(a);
错误讯息:
/usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h:258:
void Eigen::PlainObjectBase<Derived>::resize(Eigen::Index, Eigen::Index) [with Derived = Eigen::Matrix<double, 6, -1>; Eigen::Index = long int]:
Assertion `(!(RowsAtCompileTime!=Dynamic) || (rows==RowsAtCompileTime)) &&
(!(ColsAtCompileTime!=Dynamic) || (cols==ColsAtCompileTime)) &&
(!(RowsAtCompileTime==Dynamic && MaxRowsAtCompileTime!=Dynamic) || (rows<=MaxRowsAtCompileTime)) &&
(!(ColsAtCompileTime==Dynamic && MaxColsAtCompileTime!=Dynamic) || (cols<=MaxColsAtCompileTime)) &&
rows>=0 && cols>=0 &&
"Invalid sizes when resizing a matrix or array."' failed.
Aborted (core dumped)
答案 0 :(得分:2)
我不能用这个自包含的例子重现:
#include <Eigen/Dense>
#include <iostream>
template<typename Derived>
Derived dampedPinv(const Eigen::MatrixBase<Derived>& a, double rho = 1e-4) {
return a.transpose() * (a*a.transpose() + rho*rho*Eigen::MatrixBase<Derived>::Identity(a.rows(), a.rows()) ).inverse();
}
int main()
{
Eigen::MatrixXd a = Eigen::MatrixXd::Zero(6,1);
a(3,0) = 1;
Eigen::MatrixXd ainv = Eigen::MatrixXd::Zero(6,1);
ainv = dampedPinv(a);
std::cout << ainv << "\n";
}
使用Eigen 3.2.10或3.3.1。请确保您使用的是最新版本,如果是这样,并且仍然遇到问题,请在调试器中运行以获取回溯并进入以查看未满足的精确条件。