我有一个FFT过程fftconvx
将两个张量Ttnsr
和S
作为输入参数,并将结果生成另一个张量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);
我相信有一个更优雅的解决方案。
答案 0 :(得分:1)
在不知道Blitz ++的情况下,我提供了这种可能的解决方案。
看起来Gtnsr是一个SliceInfo而不是一个Array,但它有一个运算符Array。
将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( ... );