On Tue, Dec 17, 2019 at 4:15 AM Wood, Tobias <[email protected]> wrote:

> Hello,
>
>
>
> I am trying to write a finite difference function for Eigen::Tensors.
> Currently I am using a lambda:
>
>
>
> auto diff = [](Eigen::Tensor<std::complex<float>, 3> const &a, Eigen::
> Index const d) {
>
>   Dims3 const sz{a.dimension(0) - 2, a.dimension(1) - 2, a.dimension(2) -
> 2};
>
>   Dims3 const st1{1, 1, 1};
>
>   Dims3 fwd{1, 1, 1};
>
>   Dims3 bck{1, 1, 1};
>
>   fwd[d] = 2;
>
>   bck[d] = 0;
>
>
>
>   return (a.slice(fwd, sz) - a.slice(bck, sz)) / a.slice(st1, sz).constant
> (2.f);
>
> };
>
>
>
> This works okay. However, I would like to do two things:
>
>
>
> 1 – Change this from a lambda into a free function. What should the return
> type of the function be, so that it returns the expression/operation and
> does not evaluate the tensor into a temporary?
>

>
2 – I would prefer to pass in a TensorRef, so I can pass in a .chip() from
> a 4D tensor without a temporary. When I try to do this with the current
> lambda, and I am assigning to a slice, e.g.
>
>
>
> b.chip<3>(0).slice(st1, sz) = diff(a, 0);
>
>
>
> I get the following error:
>
>
>
> TensorRef.h:413:51: error: cannot initialize return object of type
> 'Eigen::TensorEvaluator<const
> Eigen::TensorRef<Eigen::Tensor<std::__1::complex<float>, 3, 0, long> >,
> Eigen::ThreadPoolDevice>::Scalar *' (aka 'std::__1::complex<float> *') with
> an rvalue of type 'const
> Eigen::TensorRef<Eigen::Tensor<std::__1::complex<float>, 3, 0, long>
> >::Scalar *' (aka 'const std::__1::complex<float> *')
>
>
>
This appears to be complaining that I can’t assign a `const
> std::complex<float> *` to a `std::complex<float> *`?
>
>
Can you create a minimal repro for this, can't quite figure out how you try
to use TensorRef, and what is the source of `const` in the expression.
Looks like a bug somewhere in typedefs.


>
> Thanks in advance,
>
> Toby
>

Reply via email to