如何正确地将特征张量传递给函数?

问题描述 投票:0回答:2

我在使用特征张量将一个函数传递到另一个函数内时遇到一些问题。例如,在 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);
c++ eigen tensor
2个回答
1
投票

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;
}

注意:您可能还会发现有关将特征类型传递给函数的文档很有趣。


0
投票

我原以为模板地狱会更糟糕。这有点无关,但如果你想将某些类型的几何操作作为可写引用传递(例如,将重塑的张量传递给函数,然后在函数体内传递芯片、切片等),你必须使用模板化的 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;
}

希望这可以帮助任何像我一样在这个库中苦苦挣扎的人。至少可以说该文档非常简短......

© www.soinside.com 2019 - 2024. All rights reserved.