0

入力パラメータとして 2 つの tensor を取り、結果を別の tensor に生成するFFTfftconvxプロシージャがあります。すべてのテンソルは Blitz++ arrays として定義されます。ここで、は配列のランクです。プロシージャは、二重ループ内で複数回呼び出す必要があります。TtnsrSGArray<complex<double>, N>Nfftconvx

理想的には、サブ配列を渡す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