如何传递Blitz++子数组作为过程的输入/输出参数
How to pass Blitz++ subarray as an input/output parameter of a procedure
我有一个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);
我相信还有一个更优雅的解决方案。
在不知道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( ... );
相关文章:
- 字符的输入/输出操作
- C++ 中文件输入输出中的长长 v/s int
- 要求用户输入C++输出文件名
- 在C++中重载输入/输出运算符
- 从用户获取输入/输出
- 如何选择waveIn/waveOut函数C++使用的输入/输出设备
- C++击球平均值程序使用输入/输出文件打印名称,平均值,最高/最低平均值时遇到麻烦
- 从 2 位输入输出 4 位数字年份
- 标准输入输出操作如何C++完成
- Windows 中应用程序的每秒输入/输出操作数
- 如何初始化可以设置为默认数组并将输入/输出作为数组的类函数?
- 输入/输出和类
- 使用 Octave GNU 访问输入/输出文件
- (C++)分解这个简单的输入/输出代码:
- TensorFlow模型:如何从原始爱好文件中识别输入/输出节点名称
- 干净取消在输入/输出调用中被阻止的 std::线程
- 将线程之间的标准输入/输出重定向
- 输入/输出异或字符串的 C++ 问题
- C++输入/输出错误
- C++输入输出