关于 C/C++ 中 FFTW 的内存参考
about memory reference for fftw in c/c++
我正在用c ++学习fftw(替换自定义的fft函数)。在旧代码中,我有在 std::vector 样本存储中设计的算法。根据文档,我使用强制转换将 fftw 数据类型与我的数据交互(在 std::vector 中)。
#include <fftw3.h>
#include <vector>
#include <iostream>
#include <complex>
using namespace std;
void main(void)
{
std::vector< complex<double> > x(4);
x[0] = std::complex<double>(0.0, 0.0);
x[1] = std::complex<double>(1.0, 0.0);
x[2] = std::complex<double>(0.0, 2.0);
x[3] = std::complex<double>(3.0, 3.0);
// print the vector, looks good
for (int i=0; i<4; i++)
{
cout << x[i] << endl;
}
// refer fftw datatype to the std::vector by casting
fftw_complex* in = reinterpret_cast<fftw_complex*>(&x[0]);
// print in reference, gives random numbers
for (int i=0; i<4; i++)
{
cout << *in[i*2] << " " << *in[i*2+1] << endl;
}
}
但在似乎并没有真正指向正确的位置,而是显示随机数。除了上面的问题,我的目的是生成一个包含 8 个元素的向量(示例),前 4 个元素引用 std::vector,但后四个元素初始化为某个常量。是否可以让 *in 指向向量中的第一个,然后指向其他地方的 4 个常量值,这样我就可以 fftw "in"?谢谢。
如 http://www.fftw.org/fftw3_doc/Complex-numbers.html#Complex-numbers 中所述,您必须使用 reinterpret_cast 从 double 转换为 fftw_complex。我想这是为数不多的建议使用案例之一。
它还说fftw_complex被定义为:
typedef double fftw_complex[2];
因此,横向循环的正确方法是执行以下操作:
for (int i=0; i<4; i++)
{
fftw_complex* in = reinterpret_cast<fftw_complex*>(&x[i]);
cout << (*in)[0] << " " << (*in)[1] << endl;
}
更新
您还可以像以前一样保留指针定义,并为此插入循环:
for (int i=0; i<4; i++)
{
cout << (in[i])[0] << " " << (in[i])[1] << endl;
}
首先,永远不要使用reinterpret_cast,因为这可能会导致可怕的错误。
其次,定义为复数,具有 2 个双精度的结构。因此,in[i*2] 将访问由 i*2 索引的复数,由数组中的双精度数 (i*2)*2 和 (i*2)*2+1 组成。在 i==1 时,您实际上会输出第 4 个复数,而不是第 2 个复数,而在 i==2 时,您将超出界限,导致无效的内存访问崩溃或垃圾输出。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- C++错误消息*成员参考.**初学者*
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 当课程成员成员时,为什么参考会占据内存
- 可以参考实际上占据内存
- 堆栈上的参考用途有多少内存
- C 通过参考分配 /数组传递内存
- Do C 参考需要任何内存
- 这个用于地图的参考计数内存管理器的概念好吗?
- 终端中未显示内存地址(参考)
- 使用带有参考的手动内存管理
- 关于 C/C++ 中 FFTW 的内存参考
- 通行证参考和内存使用情况