[英]Will array form of two different shape BSTs always have non-equal arrays
[英]DenseBase, auto, and binary operation says arrays have different shape
我编写了一个将两个DenseBase
作为参数的函数。
该函数使用.derived().array()
将Array
和Matrix
都转换为Array
。
我厌倦了多次编写derived
并使用自动。
但是auto
会导致奇怪的错误。 Eigen抱怨x2
和y2
形状不同。
如果我不想.derived().array()
编写.derived().array()
,该怎么用?
Eigen来自https://github.com/eigenteam/eigen-git-mirror.git
#include <Eigen/Eigen>
int main() {
Eigen::ArrayXf x(3);
Eigen::ArrayXf y(3);
x << 1, 2, 3;
y << 4, 5, 6;
// x.derived().array() * y.derived().array();
auto x2 = x.derived().array();
auto y2 = y.derived().array();
y2 = x2 * y2;
}
运行时错误:
CwiseBinaryOp.h:110: ...
Assertion `aLhs.rows() == aRhs.rows()
&& aLhs.cols() == aRhs.cols()' failed.
您可以通过auto x2 = x.array().derived();
来解决运行时问题auto x2 = x.array().derived();
,即:反向数组并派生。 但是,此处不建议使用auto
。 这就是为什么。 说您有:
template <typename T> void foo(DenseBase<T> &x);
如果T
是Array<>
则x.array().derived()
是Array<>
并且x2
将是x
的深层副本。 在这种情况下,您想使用auto& x2 = ...
如果T
是其他东西,例如Matrix<>
,则auto x2 = x.array().derived();
非常好,但不是auto& x2 = ...
因此,您真正想要的是一些复杂的东西:
internal::ref_selector<std::decay<decltype(x.array().derived())>::type>::non_const_type
x2 = x.array().derived();
不是很好 :(
一个更简单的解决方案是,即使对于数组世界中已经存在的输入,也不必打扰并创建ArrayWrapper
:
ArrayWrapper<T> x2(x.derived());
另一个简单的解决方案是强制调用方在数组世界中传递表达式:
template <typename T> void foo(ArrayBase<T> &x) {
T& x2(x.derived());
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.