实现阻尼伪逆时的特征,矩阵调整大小问题

时间:2017-01-11 10:19:43

标签: c++ eigen

我试图为具有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)

1 个答案:

答案 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。请确保您使用的是最新版本,如果是这样,并且仍然遇到问题,请在调试器中运行以获取回溯并进入以查看未满足的精确条件。