gpt4 book ai didi

采用 DenseBase 的模板函数中的 c++ 特征 block 操作

转载 作者:行者123 更新时间:2023-11-28 04:59:47 25 4
gpt4 key购买 nike

这行得通

Vector2d a(1,2);
VectorXd cc(10);
cc << 1.0, 2.0, 3, 4, 5, 6, 7, 8, 9;
VectorXd rr(10);
rr << 1.0, 2.0, 3, 4, 5, 6, 7, 8, 9;
int R(10);
Vector2d G(Vector2d::Zero());


G.noalias() -= cc.segment(4, 2) +
(rr.segment(1, 2) - R*Vector2d::Ones()).cwiseQuotient(a); // OK here

但是当 rr.segment(1, 2) 作为参数传递给函数时,最后一行中的运算符 - 无法编译。问题出现在这段代码中

template <typename DerivedA, typename DerivedB, typename DerivedC>
void testFunc(MatrixBase<DerivedA>& G, const DenseBase<DerivedB>& c, const DenseBase<DerivedC>& r)
{
Vector2d a(1,2);
int R(10);
G.noalias() -= c + (r - R*Vector2d::Ones()).cwiseQuotient(a);
};

VectorXd cc(10);
cc << 1.0, 2.0, 3, 4, 5, 6, 7, 8, 9;
VectorXd rr(10);
rr << 1.0, 2.0, 3, 4, 5, 6, 7, 8, 9;
Vector2d G(Vector2d::Zero());
testFunc(G, cc.segment(4, 2), rr.segment(1, 2)); // ERROR : no match for 'operator-'

我知道问题在于在 testFunc() 中,cc.segment 被视为一个通用的 DenseBase 对象,它没有实现运算符-,尽管它是为特定类 .block() 实现的。

最佳答案

您可以告诉 Eigen 使用 DenseBase 封装的实际类型写作类c.derived()r.derived() .

不相关:而不是 R*Vector2d::Ones()Vector2d::Constant(R) ,并且如果整个表达式是按元素操作,则无论如何您都应该在 Array 域中工作:

template <typename DerivedA, typename DerivedB, typename DerivedC>
void testFunc(MatrixBase<DerivedA>& G, const DenseBase<DerivedB>& c, const DenseBase<DerivedC>& r)
{
Array2d a(1,2);
int R(10);
G.array() -= c.derived().array() + (r.derived().array() - R)/a;
}

(如果您通过了 .derived() 而不是 .array()ArrayBase,则可以省略所有 MatrixBaseDenseBase)

另外,.noalias()仅当涉及矩阵产品时才有必要。

关于采用 DenseBase 的模板函数中的 c++ 特征 block 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46361059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com