入力パラメータとして 2 つの tensor を取り、結果を別の tensor に生成するFFTfftconvx
プロシージャがあります。すべてのテンソルは Blitz++ arrays として定義されます。ここで、は配列のランクです。プロシージャは、二重ループ内で複数回呼び出す必要があります。Ttnsr
S
G
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);
もっとエレガントな解決策があると思います。