首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Blitz++子数组作为过程的输入/输出参数传递

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

Stack Overflow用户
提问于 2014-10-14 08:29:21
回答 1查看 416关注 0票数 0

我有一个快速傅立叶变换程序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),如下所示:

代码语言:javascript
复制
fftconvx( Gtnsr(t,p,ri,rj,rk,0), Ttnsr, Stnsr(ri,rj,rk,0) );

变量ri,rj,rk是Blitz++数组范围。不幸的是,这不起作用,并导致以下编译错误:

代码语言:javascript
复制
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的签名是:

代码语言:javascript
复制
void fftconvx(Array<complex<double>, 3> &c,
              Array<complex<double>, 3> x2,
              Array<complex<double>, 3> x1,
              ...);

有更多的数组和变量作为输入参数传递,但为了简洁起见,我省略了它们。

到目前为止,我已经提出了基于临时数组SG的解决方案。

代码语言:javascript
复制
S(ri,rj,rk) = Stnsr(ri,rj,rk,0);

fftconvx(G, Ttnsr, S);

Gtnsr(t,p,ri,rj,rk,0) = G(ri,rj,rk);

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-14 14:50:03

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

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

因此,将fftconvx更改为

代码语言:javascript
复制
template<class SliceOrArray>
void fftconvx(SliceOrArray &c,
              const Array<complex<double>, 3> x2,
              const Array<complex<double>, 3> x1,
              ...);

如果fft卷积中的操作允许使用该片,则可能会工作。

如果Blitz++被选择为C++11,那么以下内容也可能有效。

代码语言:javascript
复制
G fftconvx(   const Array<complex<double>, 3> x2,
              const Array<complex<double>, 3> x1,
              ...) {
    G c;
    ...
    return c; // C++11 NRVO
};

然后打电话

代码语言:javascript
复制
Gtnsr(t,p,ri,rj,rk,0) = fftconvx( ... );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26356066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档