我写了一个以两个DenseBase
作为参数的函数。
该函数使用.derived().array()
将Array
和Matrix
都转换为Array
。
我厌倦了多次写derived
并使用自动。
但是auto
导致奇怪的错误。 Eigen抱怨x2
和y2
的形状不一样。
如果我不想多次写.derived().array()
,该怎么用?
本征来自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.
答案 0 :(得分:2)
您可以使用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());
...
}