【发布时间】:2017-09-21 08:52:12
【问题描述】:
我想使用 Eigen::Ref 来获得使用 Eigen::Matrix 参数的非模板函数。我的问题是,在这些函数中,我可能必须调整 Eigen::Ref 引用的矩阵的大小。我知道,一般而言,不应调整 Eigen::Ref 的大小,因为它可以映射到表达式或矩阵块,但在我的情况下,我确信 Eigen::Ref 背后的内容是 Eigen::Matrix。
为了说明这一点:
#include "Eigen/Dense"
void add(Eigen::Ref<Eigen::MatrixXd> M, const Eigen::Ref<const Eigen::MatrixXd> &A, const Eigen::Ref<const Eigen::MatrixXd> &B) {
M=A+B;
}
int main() {
Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor, 32, 32> M(2,3);
Eigen::Matrix<double, 2, 2> A;
Eigen::Matrix<double, 2, 2> B;
add(M,A,B);
}
在运行时给出:
void Eigen::DenseBase<Derived>::resize(Eigen::Index, Eigen::Index) [with Derived = Eigen::Ref<Eigen::Matrix<double, -1, -1> >; Eigen::Index = long int]: Assertion `rows == this->rows() && cols == this->cols() && "DenseBase::resize() does not actually allow to resize."' failed.
我试图欺骗它:
void add(Eigen::Ref<Eigen::MatrixXd> M, const Eigen::Ref<const Eigen::MatrixXd> &A, const Eigen::Ref<const Eigen::MatrixXd> &B) {
Eigen::Ref<Eigen::Matrix<double,2,2>> MM(M);
MM=A+B;
}
但我在运行时得到:
Eigen::internal::variable_if_dynamic<T, Value>::variable_if_dynamic(T) [with T = long int; int Value = 2]: Assertion `v == T(Value)' failed.
那么,我能做些什么来处理这个问题?在 Eigen 文档中,使用 MatrixBase 作为参数的模板函数解决了调整大小的问题,但对于 Eigen::Ref?
【问题讨论】:
-
如果您确定它引用了
Eigen::MatrixXd,为什么不传递Eigen::MatrixXd & M? -
抱歉,没有完全阅读您的问题。假设
32并不总是相同,您可以将其作为模板参数传递。否则,我看不到实现此功能的安全方法。 -
我不想要模板函数,因为我希望它是虚拟的...
-
main中的M的MaxRowsAtCompileTime和MaxColsAtCompileTime不会存储在Ref对象中。并且实际的行数和列数将被复制到Ref。所以没有办法安全地调整Ref对象的大小。M对象在编译时是否始终具有固定的最大大小? -
不,M 并不总是具有相同的最大尺寸。实际上,我什至可以将 Eigen::Matrix
作为 M,但在这种情况下,我确信在我的 add 函数等效项中不会发生调整大小。我知道没有“安全”的方式来调整 Eigen::Ref 的大小,但我想告诉 Eigen 相信我!