我在使用特征张量将一个函数传递到另一个函数内时遇到一些问题。例如,在 main.cpp 代码中调用 Function1 工作正常,但在 Function2 内部调用会导致错误。
void Function1(Eigen::Tensor<std::complex<double>, 3>& vark, Eigen::Tensor<double, 3> Kin, Eigen::Tensor<std::complex<double>, 3>& Out){
Out = vark * Kin * 1i;
}
void Function2(Eigen::Tensor<std::complex<double>, 3>& In, Eigen::Tensor<std::complex<double>, 3>& kin){
Eigen::Tensor<std::complex<double>, 3> out(nx,ny,nz);
out.setZero();
Function1(In, kin, Out); //error in Kin as it's passed from the function
}
我得到的错误:
error: cannot convert ‘Eigen::TensorEvaluator<Eigen::Tensor<double, 3>, Eigen::DefaultDevice>::EvaluatorPointerType’ {aka ‘double*’} to ‘Eigen::TensorEvaluator<const Eigen::Tensor<std::complex<double>, 3>, Eigen::DefaultDevice>::EvaluatorPointerType’ {aka ‘const std::complex<double>*’}
152 | return m_rightImpl.evalSubExprsIfNeeded(m_leftImpl.data());
| ^
| |
| Eigen::TensorEvaluator<Eigen::Tensor<double, 3>, Eigen::DefaultDevice>::EvaluatorPointerType {aka double*}
我很困惑为什么会发生这种情况。
编辑:我添加了两个函数的头文件:
void Function1(Eigen::Tensor<std::complex<double>, 3>& vark, Eigen::Tensor<double, 3> Kin, Eigen::Tensor<std::complex<double>, 3>& Out);
void Function2(Eigen::Tensor<std::complex<double>, 3>& In, Eigen::Tensor<std::complex<double>, 3>& kin);
Kin
的Function1()
参数是double
的张量,而不是complex<double>
的张量。然而,在 Function2()
中,你传入了 complex<double>
。因此编译器抱怨它无法将 complex<double>
张量转换为 double
之一。修复:将 Kin
参数更改为 Eigen::Tensor<std::complex<double>, 3>
,并出于性能原因添加 const&
:
void Function1(
Eigen::Tensor<std::complex<double>, 3> const & vark,
Eigen::Tensor<std::complex<double>, 3> const & Kin,
Eigen::Tensor<std::complex<double>, 3> & Out)
{
Out = vark * Kin * 1i;
}
注意:您可能还会发现有关将特征类型传递给函数的文档很有趣。
我原以为模板地狱会更糟糕。这有点无关,但如果你想将某些类型的几何操作作为可写引用传递(例如,将重塑的张量传递给函数,然后在函数体内传递芯片、切片等),你必须使用模板化的 const TensorBase&作为函数参数并在函数体内将其转换为非常量:
template <class derived>
void func(const TensorBase<derived>& ten){
auto& res = const_cast<Eigen::TensorBase<derived>&>(ten);
res.chip(0,0) = some_tensor_chip;
}
希望这可以帮助任何像我一样在这个库中苦苦挣扎的人。至少可以说该文档非常简短......