以下内容似乎无效。
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>'
任何建议为何以及如何解决?
答案 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
。