gpt4 book ai didi

c++ - 如何将 Blitz++ 子数组作为过程的输入/输出参数传递

转载 作者:行者123 更新时间:2023-11-28 06:38:37 25 4
gpt4 key购买 nike

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

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

最佳答案

在不了解 Blitz++ 的情况下,我提供了这个可能的解决方案。

看起来 Gtnsr 是一个 SliceInfo 而不是一个数组,但它有一个运算符数组。

因此将 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( ... );

关于c++ - 如何将 Blitz++ 子数组作为过程的输入/输出参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26356066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com