如何将Blitz ++子阵列作为过程的输入/输出参数传递

时间:2014-10-14 08:29:22

标签: c++ multidimensional-array procedure blitz++

我有一个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,
              ...);

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

到目前为止,我已经提出了基于临时数组SG的解决方案:

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

fftconvx(G, Ttnsr, S);

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

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

1 个答案:

答案 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( ... );