【发布时间】:2014-10-14 08:29:21
【问题描述】:
我有一个 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);
我相信有一个更优雅的解决方案。
【问题讨论】:
-
fftconvx 是如何声明的?
标签: c++ multidimensional-array procedure blitz++