2017-01-11 16 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のいずれかを使用します。最新のバージョンを使用していることを確認してください。問題が残っている場合は、デバッガで実行してバックトレースを取得し、条件が満たされていないことを確認してください。

関連する問題