0

我有一个 FFT 过程fftconvx,它采用两个张量TtnsrS作为输入参数并将结果生成到另一个张量G中。所有张量都定义为 Blitz++ 数组Array<complex<double>, N>,其中N是数组的秩。该过程fftconvx必须在双循环内多次调用。

理想情况下,我想传递子数组Stnsr(ri,rj,rk,0)Stnsr(ri,rj,rk,1)将结果接收到子数组中Gtnsr(t,p,ri,rj,rk,0)Gtnsr(t,p,ri,rj,rk,1)如下所示:

fftconvx( Gtnsr(t,p,ri,rj,rk,0), Ttnsr, Stnsr(ri,rj,rk,0) );

变量ri,rj,rk是 Blitz++ 数组范围。不幸的是,这不起作用并导致以下编译错误:

error: invalid initialization of non-const reference of type 
‘blitz::Array<std::complex<double>, 3>&’ from an rvalue of type 
‘blitz::SliceInfo<std::complex<double>, int, int, blitz::Range, blitz::Range, 
 blitz::Range, int, blitz::nilArraySection, blitz::nilArraySection, 
 blitz::nilArraySection, blitz::nilArraySection, blitz::nilArraySection>::T_slice
{aka blitz::Array<std::complex<double>, 3>}’

fftconvx(Gtnsr(t,p,ri,rj,rk,0), Ttnsr, Stnsr(ri,rj,rk,0));

的签名fftconvx是:

void fftconvx(Array<complex<double>, 3> &c,
              Array<complex<double>, 3> x2,
              Array<complex<double>, 3> x1,
              ...);

有更多的数组和变量作为输入参数传递,但为简洁起见,我省略了它们。

到目前为止,我已经提出了基于临时数组的解决方案,S并且G

S(ri,rj,rk) = Stnsr(ri,rj,rk,0);

fftconvx(G, Ttnsr, S);

Gtnsr(t,p,ri,rj,rk,0) = G(ri,rj,rk);

我相信有一个更优雅的解决方案。

4

1 回答 1

1

在不知道 Blitz++ 的情况下,我提供了这个可能的解决方案。

看起来 Gtnsr 是一个 SliceInfo 而不是一个数组,但它有一个运算符数组。

所以改变fftconvx

template<class SliceOrArray>
void fftconvx(SliceOrArray &c,
              const Array<complex<double>, 3> x2,
              const Array<complex<double>, 3> x1,
              ...);

如果 fftconvx 中的操作允许使用切片,则可能会起作用。

如果 Blitz++ 已更新为 C++11,则以下内容也可能有效。

G fftconvx(   const Array<complex<double>, 3> x2,
              const Array<complex<double>, 3> x1,
              ...) {
    G c;
    ...
    return c; // C++11 NRVO
};

然后打电话

Gtnsr(t,p,ri,rj,rk,0) = fftconvx( ... );
于 2014-10-14T14:50:03.980 回答