C++ C++;本征:';选项';:不是';本征::矩阵基<;派生>';
每当我尝试为Eigen创建模板函数时,都会出现如下错误: 错误C2039:“选项”:不是“Eigen::MatrixBase”的成员 此错误来自以下函数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
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,然后使函数直接返回特征值,而不是在缓冲区中。谢谢你的解释,我会试试看!