与问题Pointer vs Reference difference when passing Eigen objects as arguments类似
假设我们有foo1和矩阵mat2by2:
Matrix33d mat2by2;
mat2by2 << 1,2,
3,4;
和
void foo2(Ref<MatrixXd> container){
//...container matrix is modified here
}
阅读http://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html之后,似乎foo1的更好替代方案可能是:
void foo(Eigen::MatrixXd* container){
//...container matrix is modified here
}
如果将foo2的参数作为参考传递, 什么是使用Eigen :: Ref类??
传递指针的等价物Option
答案 0 :(得分:1)
我认为基本的想法是不直接使用指针或引用。 Eigen使用模板表达式来表示计算。这意味着类型会根据用于计算矩阵的表达式而更改,并且表达式可能会在未评估的情况下进行。
如果需要,Ref会将模板表达式计算为一个临时对象,该临时对象与您请求作为参数传递的内存布局相匹配。如果参数的内存布局与参数所需的内存布局相匹配,则Ref将充当透明引用。
直接从文档中借用:您的输入参数应声明为常量,而非const参数可用作输出参数。
void cov(const Ref<const MatrixXf> x, Ref<MatrixXf> C)
{
...
C = ...; // Your return value here
}
如果你读取和写入矩阵,参数显然也应该是非常量的。
对于可选参数,您可以使用指向Ref。
的指针编辑:文档确实注意到您可以直接使用常量引用来传递参数。这只能起作用,因为编译器很乐意将临时对象转换为const引用。它不适用于指针。