Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;本征:';选项';:不是';本征::矩阵基<;派生>';_C++_Templates_Eigen - Fatal编程技术网

C++ C++;本征:';选项';:不是';本征::矩阵基<;派生>';

C++ C++;本征:';选项';:不是';本征::矩阵基<;派生>';,c++,templates,eigen,C++,Templates,Eigen,每当我尝试为Eigen创建模板函数时,都会出现如下错误: 错误C2039:“选项”:不是“Eigen::MatrixBase”的成员 此错误来自以下函数 template<typename Derived1, typename Derived2> void eig(const MatrixBase<Derived1> & A, MatrixBase<Derived2> & eigenvaluesBuff) { EigenSolver&l

每当我尝试为Eigen创建模板函数时,都会出现如下错误:

错误C2039:“选项”:不是“Eigen::MatrixBase”的成员

此错误来自以下函数

template<typename Derived1, typename Derived2>
void eig(const MatrixBase<Derived1> & A, MatrixBase<Derived2> & eigenvaluesBuff) {
    EigenSolver<MatrixBase<Derived1>> es(A, false);
    eigenvaluesBuff = es.eigenvalues().real().col(0);
}
模板
无效eig(常数矩阵基和A、矩阵基和特征值SBUFF){
特征解算器es(A,假);
特征值buff=es.特征值().real().col(0);
}

矩阵A是由不同函数返回的矩阵XD。知道我做错了什么吗?如果一个函数返回一个矩阵xSD,你能不能将结果直接传递到Eigen中的模板函数中?

EigenSolver的模板参数需要是更具体模板的实例化,而不是
Eigen::MatrixBase
(参见文档)。所以我会把你的模板函数改为

template<typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols, typename Derived2>
void eig(const Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> & A, MatrixBase<Derived2> & eigenvaluesBuff) {
    typedef Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> MatrixType;
    EigenSolver<MatrixType> es(A, false);
    eigenvaluesBuff = es.eigenvalues().real().col(0);
}
template<typename Derived1, typename Derived2>
void eig(const MatrixBase<Derived1> & A, MatrixBase<Derived2> & eigenvaluesBuff) {
    eigenvaluesBuff = A.eigenvalues();
}
模板
无效eig(常数矩阵&A、矩阵基&SBUFF){
类型定义矩阵矩阵类型;
特征解算器es(A,假);
特征值buff=es.特征值().real().col(0);
}
您还可以将函数简化为

template<typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols, typename Derived2>
void eig(const Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> & A, MatrixBase<Derived2> & eigenvaluesBuff) {
    typedef Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> MatrixType;
    EigenSolver<MatrixType> es(A, false);
    eigenvaluesBuff = es.eigenvalues().real().col(0);
}
template<typename Derived1, typename Derived2>
void eig(const MatrixBase<Derived1> & A, MatrixBase<Derived2> & eigenvaluesBuff) {
    eigenvaluesBuff = A.eigenvalues();
}
模板
无效eig(常数矩阵基和A、矩阵基和特征值SBUFF){
特征值buff=A.特征值();
}

为了完成David的回答,让我补充一点,您可以获得与给定表达式匹配的矩阵类型和PlainObjectType。因此,更普遍的解决办法是:

template<typename Derived1, typename Derived2>
void eig(const MatrixBase<Derived1> & A, MatrixBase<Derived2> & eigenvaluesBuff) {
    EigenSolver<typename Derived1::PlainObjectType > es(A.derived(), false);
    eigenvaluesBuff = es.eigenvalues().real().col(0);
}
模板
无效eig(常数矩阵基和A、矩阵基和特征值SBUFF){
特征解算器es(A.派生(),假);
特征值buff=es.特征值().real().col(0);
}

我正在尝试使所有函数尽可能类似于matlab。在这种情况下,这意味着将其重命名为eig,然后使函数直接返回特征值,而不是在缓冲区中。谢谢你的解释,我会试试看!