我正在使用Eigen库在Eclipse C ++中实现一些控制算法。 当我想计算矩阵的特征值时,我会在代码行旁边收到“从这里需要”警告,作为感叹号。 而且我不知道如何解决。

这是我的main.cpp文件:

#include <iostream>
#include "System.h"
#include "ControllerCode2.h"

using namespace std;


int main(){

    int n = 3;   // # of states
    int m = 1;   // # of inputs
    int l = 1;   // # of outputs

    MatrixXd A(n, n), B(n,m), C(l,n), D(l,m), Q(n,n), R(m,m), Qe(n,n), Re(m,m);

    A << 0,  1,  0,
         0,  0,  1,
         0, -2, -3;

    B << 0,
         0,
         1;

    C << 1, 0, 0;

    D << 0;

    MatrixXd C_trans = C.transpose();
    Q = C_trans * C;
    R =  MatrixXd::Identity(m, m); // initially

    MatrixXd B_trans = B.transpose();
    Qe = B * B_trans;
    Re =  MatrixXd::Identity(m, m); // initially

    System sys = System(A, B, C, D);

    sys.set_covariance_matrices(R, Q);
    sys.set_noise_covariance_matrices(Re, Qe);
    schur_eigen_test(sys);

    return 5;
}

现在,ControllerCode2.cpp代码:

#include "ControllerCode2.h"

MatrixXd U11;
MatrixXd U21;

void schur_eigen_test( System G ){
    /****** Constructing the Hamiltonian Matrix ******/
    int n = G.A.rows();
    MatrixXd H(2*n, 2*n);          // the Hamiltonian matrix has the dimensions of 2n*2n where n is the number of states
    H.block(0,0,n,n)      = G.A;
    H.block(0,n,n,n)      = -1 * G.B * G.R.inverse() * G.B.transpose();
    H.block(n,0,n,n)      = -1 * G.Q;
    H.block(n,n,n,n)      = -1 * G.A.transpose();

    /****** Performing a real Schur decomposition on the square Hamiltonian matrix ******/
    RealSchur<MatrixXd> schur(H);
    MatrixXd U = schur.matrixU(); //The orthogonal matrix U
    MatrixXd T = schur.matrixT(); //The quasi-triangular matrix T


    /****** Find the eigenvalues and eigenvectors of the Hamiltonian matrix ******/
    EigenSolver<MatrixXd> H_eigen;        // create an EigenSolver Matrix
    H_eigen.compute(H, false);            // compute the eigenvalues ./and eigenvectors of matrix H
    MatrixXd H_eigenval = H_eigen.eigenvalues();
    //              //MatrixXd H_eigenvec = H_eigen.eigenvectors();


    /****** Select the eigenvectors (U11, U21) corresponding to the stable (with -ve real part) eigenvalues ******/
    U11 = U.block(0,0,n,n);
    U21 = U.block(n,0,n,n);

    /****** Calculate F ******/
    MatrixXd F = -1 * G.R.inverse() * G.B.transpose() * U21 * U11.inverse(); // transposeInPlace or transpose??

    //////// Extra: for output
    cout << endl << "H = " << endl << H << endl;
    cout << endl << "U schur(H) " << endl << U << endl;
    cout << endl << "T schur(H) " << endl << T << endl;
    cout << endl << "U*T*U.transpose() " << endl << U * T * U.transpose();

    //      cout << endl << "U.transpose() - U.inverse() " << endl << U.transpose() - U.inverse(); // = which proves that U is orthogonal, i.e. U.transpose() = U.inverse()
    //      EigenSolver<MatrixXd> H_eigen;        // create an EigenSolver Matrix
    //      H_eigen.compute(H, false);            // compute the eigenvalues and eigenvectors of matrix H
    //      MatrixXd H_eigenval = H_eigen.eigenvalues();
    //      cout << endl << "eigenvalues of H = " << endl << H_eigenval << endl;
}

我在此行旁边收到警告:

MatrixXd H_eigenval = H_eigen.eigenvalues();

我的ControllerCode2.h代码:

#ifndef CONTROLLERCODE_H_
#define CONTROLLERCODE_H_

#include "System.h"

    void schur_eigen_test( System );

//};

#endif /* CONTROLLERCODE_H_ */

System.h代码:

// include guard
#ifndef SYSTEM_H_
#define SYSTEM_H_

#include <Eigen/Dense>
#include <iostream>
#include <Eigen/Eigenvalues>
#include <iostream>

using namespace Eigen;
using namespace std;
using Eigen::MatrixXd;


class System {

public:

    MatrixXd A;
    MatrixXd B;
    MatrixXd C;
    MatrixXd D;
    MatrixXd Q;
    MatrixXd R;
    MatrixXd Re;
    MatrixXd Qe;


    System(MatrixXd a, MatrixXd b, MatrixXd c, MatrixXd d){
        A = a;
        B = b;
        C = c;
        D = d;
        //cout << A << endl << B << endl << C << endl;
    };

    void set_covariance_matrices(MatrixXd r, MatrixXd q){
        R = r;
        Q = q;
        //cout << R << endl << Q << endl;
    }

    void set_noise_covariance_matrices(MatrixXd re, MatrixXd qe){
        Re = re;
        Qe = qe;
        //cout << Re << endl << Qe << endl;
    }


    virtual ~System();

    // this function receives the 4 state space matrices and returns one plant matrix G
    MatrixXd setContSys(MatrixXd a, MatrixXd b, MatrixXd c, MatrixXd d);

};

#endif /* SYSTEM_H_ */

最后这是控制台中显示的结果:

15:12:51 **** Incremental Build of configuration Debug for project Controller ****
Info: Internal Builder is used for build
g++ "-IC:\\Users\\Alsharif\\eigen" -O0 -g3 -Wall -c -fmessage-length=0 -o ControllerCode2.o "..\\ControllerCode2.cpp" 
In file included from C:\Users\Alsharif\eigen/Eigen/Core:285:0,
                 from C:\Users\Alsharif\eigen/Eigen/Dense:1,
                 from ..\System.h:12,
                 from ..\ControllerCode2.h:11,
                 from ..\ControllerCode2.cpp:8:
C:\Users\Alsharif\eigen/Eigen/src/Core/Matrix.h: In instantiation of 'Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::Matrix(const Eigen::MatrixBase<OtherDerived>&) [with OtherDerived = Eigen::Matrix<std::complex<double>, -1, 1>; _Scalar = double; int _Rows = -1; int _Cols = -1; int _Options = 0; int _MaxRows = -1; int _MaxCols = -1]':
..\ControllerCode2.cpp:220:45:   required from here
C:\Users\Alsharif\eigen/Eigen/src/Core/util/StaticAssert.h:115:9: error: 'YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY' is not a member of 'Eigen::internal::static_assertion<false>'
         if (Eigen::internal::static_assertion<static_cast<bool>(CONDITION)>::MSG) {}
         ^
C:\Users\Alsharif\eigen/Eigen/src/Core/Matrix.h:326:7: note: in expansion of macro 'EIGEN_STATIC_ASSERT'
       EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
       ^

15:12:55 Build Finished (took 4s.567ms)

#1楼 票数:0 已采纳

因此,您得到了一个静态断言: YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY

我不是Eigen的专家,但是我看到EigenSolver返回const EigenvalueType& ,这是另一种矩阵类型,而不是用于实例化EigenSolver (在您的情况下为MatrixXd )。

因此,您应该使用正确的类型,或显式转换矩阵,这就是static assert所说的。

  ask by M.A. translate from so

未解决问题?本站智能推荐:

1回复

Eclipse无法完全解析EigenC++库,但它编译好了

我在ubuntu上使用Eigen C ++矩阵库和Eclipse。 这是简单的代码: #include <iostream> #include <eigen3/Eigen/Core> using namespace Eigen; using namespace
1回复

在eclipse中使用Eigen3,无法编译

我下载了最新版本并完全按照自述文件中的描述完成了方法2: 并且终端显示它已正确安装,并且从eclipse include文件夹中我可以看到它安装在usr / local / include中, 但是当我在eclipse中编译以下测试程序时,我得到了这个: 请帮帮我谢谢!
7回复

使用特征库c++时如何删除特定行或列

我正在为我的项目使用 Eigen 库。 我正在搜索如何从 Eigen 中的给定矩阵中删除某个行或列。 我没有成功。 除了遍历整个矩阵或对矩阵 A 使用块操作之外。 有没有一种方法可以简单地做到这一点。
2回复

如何使用犰狳或特征库获取稀疏矩阵的特征分解?[关闭]

关闭。 这个问题需要更加集中。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑这篇文章来
1回复

如何使用特征库计算矩阵功率?

我需要计算某些矩阵的幂,然后得到它的特征向量。 我知道有方法pow()但我不清楚如何使用它。 现在,我的代码是: 方法getEigenvalues()采用Eigen :: Matrix类型,而不是pow()返回的类型。
1回复

使用C++特征库的未知错误

我是佛罗里达州立大学的研究生,学习金融数学。 我还是C ++的新手,但是我正在尝试实现Longstaff-Schwartz方法来为美式期权定价。 虽然,该杂志中的算法有点令人生畏,所以我试图将用Matlab编写的代码转换为C ++。 本质上,我使用Matlab代码作为指南。 一些sta
2回复

如何使用特征库计算曼哈顿距离?

我有两个向量 如何使用特征库计算曼哈顿距离? 我正在使用VS2010。
1回复

如何使用特征库计算矩阵的正确核?

我已经开始使用本征库实现算法。 我需要计算矩阵的空空间(内核)。 我已经尝试了一个立方体的矩阵, 然后,我叫它的来源 我得到 但是,我后来才意识到它的右内核和左内核是相同的,并且似乎代码片段计算了左内核。 代码在另一个测试用例上越来越疯狂了。 那么,如何计算正确的内核 ?