我使用的是Eigen 3.4和MSVC。我以前使用过Eigen::Ref
,取得了一些成功,我正在尝试使用Eigen::TensorRef
,但遇到了问题:
Eigen::Tensor<double, 3> A(3, 1, 2);
A.setValues({{{1, 2}},
{{3, 4}},
{{5, 6}}});
Eigen::array<int, 3> aBroadcast({1, 4, 1});
auto lazyBroadcastA = A.broadcast(aBroadcast);
const Eigen::TensorRef<const Eigen::Tensor<double, 3>> ref(lazyBroadcastA);
由于最后一行,这段代码无法编译。我得到了一些错误:
'Dimensions': is not a member of 'Eigen::TensorBroadcastingOp<const std::array<int,3>,const Derived>'
'IsAligned': is not a member of 'Eigen::TensorBroadcastingOp<const std::array<int,3>,const Derived>'
'Layout': is not a member of 'Eigen::TensorBroadcastingOp<const std::array<int,3>,const Derived>'
当我试图从Eigen::TensorCwiseUnaryOp
和Eigen::TensorReductionOp
构造时,也会发生同样的事情。我做了什么愚蠢的事情,或者这些行动只是不支持?
1条答案
按热度按时间ddarikpa1#
延迟广播的结果是一个
Eigen::TensorBroadcastingOp
,据我所知,它是一个准备实体,实际上在eigen
内完成一个任务。大多数操作都有一个eval
方法来进行计算。同样,我有限的理解是,当使用赋值运算符时,ops会自动计算。因此,要获得引用,您需要首先像这样
eval()
该op:const Eigen::TensorRef<const Eigen::Tensor<double, 3>> ref(lazyBroadcastA.eval());
另一种得到Tensor的方法是:
Eigen::Tensor<double, 3> A2 = lazyBroadcastA;
当我打印结果时,我得到这样的结果: