c++ 如何让Eigen::TensorRef适用于广播和其他操作?

dwthyt8l  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(144)

我使用的是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::TensorCwiseUnaryOpEigen::TensorReductionOp构造时,也会发生同样的事情。我做了什么愚蠢的事情,或者这些行动只是不支持?

ddarikpa

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;
当我打印结果时,我得到这样的结果:

相关问题