C++ 传递指针中的Eigen::Ref

C++ 传递指针中的Eigen::Ref,c++,pointers,eigen,C++,Pointers,Eigen,类似问题 假设我们有foo1和mat2by2矩阵: void foo1(MatrixXd& container){ //...container matrix is modified here } 及 我认为基本思想是不要直接使用指针或引用。Eigen使用模板表达式表示计算。这意味着类型根据用于计算矩阵的表达式而变化,并且表达式可能未赋值 如有必要,Ref将把模板表达式求值为一个临时对象,该对象与您请求作为参数传递的内存布局相匹配。如果参数的内存布局与参数所需的内存布局匹配,R

类似问题

假设我们有foo1和mat2by2矩阵:

void foo1(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
}
void cov(常数参考x,参考C)
{
...
C=…;//此处返回值
}
如果对矩阵进行读写,参数显然也应该是非常量

对于可选参数,可以使用指向Ref的指针


编辑:文档确实指出,您可以直接使用常量引用来传递参数。这仅仅是因为编译器乐于将临时对象转换为常量引用。它对指针不起作用。

您试过了吗?这似乎是对的,您是否发现了任何错误?关于编辑:因此,在将固定大小的矩阵传递给采用固定大小矩阵参数的函数的情况下,使用Ref实际上相当于“直接”按引用传递,对吗?不应该有任何正在评估的临时变量(?)如果使用非常量Ref,则不会出现临时变量。如果由于内存布局不匹配而需要一个,那么它将无法编译。一个const REF,就像C++ const引用,意思是如果内存布局不匹配,就会创建一个临时的。根据文档,如有必要,Ref将创建一个临时对象。模板表达式将被计算为临时表达式。如果可以,它将透明地引用,而不是使用临时的。constmytype&具有不同的、更有限的语义。例如,它不会将双精度矩阵转换为浮点矩阵。编译器很乐意将模板表达式计算为临时表达式(因此是常量引用)。我认为最大的好处是使用模板或Ref。如果您理解注意事项,const&也可以使用。但指针是不存在的,除非您想在获取地址之前手动强制求值到与参数类型完全匹配的临时值中。例如,请考虑一种情况,即参数始终为Matrix2d。在我看来,fun参数可以是(只读)={const Matrix2d&,const Ref},(可写的)={Matrix2d&,Matrix2d*,Ref}。我的理解是,在使用&或Ref的情况下,对于这个特定的场景,不会发生临时事件(根据ggael的说法,没有内存布局不匹配)。在这种情况下,Ref和&之间实际上没有区别。
void foo2(Ref<MatrixXd> container){
    //...container matrix is modified here
}
void foo(Eigen::MatrixXd* container){
    //...container matrix is modified here
}
void cov(const Ref<const MatrixXf> x, Ref<MatrixXf> C)
{
   ...
   C = ...; // Your return value here
}