将v.cwiseAbs()传递给接受Ref <VectorXd>的函数

时间:2019-10-20 21:53:00

标签: eigen eigen3

以下内容似乎无效。

void Foo(Ref<VectorXd> v) {
  // modifies v
}

Eigen::VectorXd v;
Foo(v.cwiseAbs());

出现以下错误消息

  

错误:无法使用Derived = Eigen :: ArrayWrapper,-1,1,true>,-1,1,false>转换'Eigen :: ArrayBase :: cwiseAbs()const> Eigen :: ArrayBase :: CwiseAbsReturnType = Eigen :: CwiseUnaryOp,const Eigen :: ArrayWrapper,-1,1,true>,-1,1,false>>>;类型名称Eigen :: internal :: traits :: Scalar = double'from'const CwiseAbsReturnType {aka const Eigen :: CwiseUnaryOp,const Eigen :: ArrayWrapper,-1,1,true>,-1,1,false>>>} '到'Eigen :: Ref>'

任何建议为何以及如何解决?

1 个答案:

答案 0 :(得分:0)

这不起作用,因为要处理//unavailable data { "_id" : "2019-10-14", "count" : 0.0 } { "_id" : "2019-10-15", "count" : 0.0 } { "_id" : "2019-10-16", "count" : 0.0 } //========================== /* 1 */ { "_id" : "2019-10-17", "count" : 9.0 } /* 2 */ { "_id" : "2019-10-18", "count" : 9.0 } /* 3 */ { "_id" : "2019-10-19", "count" : 9.0 } /* 4 */ { "_id" : "2019-10-21", "count" : 9.0 } /* 5 */ { "_id" : "2019-10-22", "count" : 9.0 } 返回的表达式,还需要两个附加的const限定符。这是有道理的,因为通过接受以引用形式接受此参数的函数,不可能修改.cwiseAbs()的结果。编译以下代码:

v.cwiseAbs()

但是,使用此修改,不允许在void Foo(const Ref<const VectorXd>& v) { std::cout << v << std::endl; } int main() { Eigen::VectorXd v(3); v << 1,-2,3; Foo(v.cwiseAbs()); } 内修改v

最简单的解决方案可能是放下Foo()并使用

Ref<>

相反。这会生成本地副本,但是就性能而言,这不是问题,因为如果要在 Foo(VectorXd v) {...} 中修改v,则无论如何都无法避免任何副本。如果Foo()保留在Ref的签名中,则可以制作Foo的副本,并使用该副本调用v.cwiseAbs()

Foo()

@chtz建议,C ++ 11可用的替代方法是

void Foo(Ref<VectorXd> v) {...}
...
Eigen::VectorXd w = v.cwiseAbs();
Foo(w);

尽管这允许在void Foo(VectorXd&& v) {...} 中修改v,但使用起来可能有些危险,因为Foo()中仅更改了一个临时变量。在Foo()中对v所做的修改不会更改Foo()中的v