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