我有一个快速傅立叶变换程序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);我相信有一个更优雅的解决方案。
发布于 2014-10-14 14:50:03
在不知道Blitz++的情况下,我提供了这个可能的解决方案。
看起来Gtnsr是一个SliceInfo,而不是一个数组,但它有一个运算符数组。
因此,将fftconvx更改为
template<class SliceOrArray>
void fftconvx(SliceOrArray &c,
const Array<complex<double>, 3> x2,
const Array<complex<double>, 3> x1,
...);如果fft卷积中的操作允许使用该片,则可能会工作。
如果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( ... );https://stackoverflow.com/questions/26356066
复制相似问题