2017-01-11 62 views
0

我想实现一个阻尼伪反函数与特征的任何大小的矩阵。我不明白为什么这个实现不起作用。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

如何去调试呢? –

+0

尝试在几个步骤中分解函数中的表达式。 然后在调试器中运行你的代码,看看哪些步骤触发了断言。这应该指向你正确的方向。 – Louen

+0

呵呵。错误表示您尝试调整为6 x -1。你能告诉我们哪个函数调用行是258行吗?你有没有尝试再次输入,假设有一些奇怪的隐藏的字符,以某种方式使1负面?顺便说一下,不应该是1x6? – Aziuth

回答

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