Как передать подмассив Blitz ++ в качестве входного / выходного параметра процедуры

У меня процедура FFT 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);

Я считаю, что есть более элегантное решение.

0

Решение

Не зная 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( ... );
1

Другие решения


По вопросам рекламы [email protected]