У меня есть процедура БПФ 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 объявленную? – Surt