c++ - Eigen::Ref 传递指针

标签 c++ pointers eigen

类似于问题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 类的按指针传递??

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
}

如果您读取和写入矩阵,则参数显然也应该是非常量。

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

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

关于c++ - Eigen::Ref 传递指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35612831/

相关文章:

c++ - C++使用位OR运算符枚举

C 编程 - 数组/指针值比较

c - 段错误但无法推理,内存分配对我来说看起来很好

c++ - Eigen ,用四元数旋转vector3d?

c++ - 如何使用 eigen 库针对 matlab 加速这个 C++ 程序?

c++ - Boost::uBLAS 与 Eigen

c++ - QT4 qlistview保存手动移动的图标位置,下次使用

c++ - 未加入且主进程被终止时的线程行为

c++ - C++中的条件运算符

c - 填充缓冲区,通过地址作为参数传递