说明: Complex 是个复数类,我在用傅里叶变换的时候用到它
1:使用中要包含#include <complex>
2:complex 赋值的几种方式:
2.1 在初始化的时候赋值 如: complex <double> c(3.2,-6);
2.2 构造无名对象赋值方式 如: c = complex <double>(3.2,-6);
2.2 用等号“=”得到一个已知的复数的值 如: complex <double> d; d =c;
2.3 因为我是用到傅里叶变换的时候用到,所以有把实数代入到复数的实部但是虚数为0的需求,所有使用了 d =(2);//这样得到右边的赋值给复数的实部,而虚数为0
2.4 但是一定不能用 把实部和虚部的值赋值给一个复数,这样得到的只会是后面的数值变为复数实部的值,而虚部为0的结果。
没做分析,据说是“=”没有进行重载,没打开看,如果要这个结果,可试试重载等号看看,
例如 d = (2,8) ; 这样得到的是一个实部为8,而虚部为0的数据
用如下方式验证
complex <double> c(3.14,-2);
complex <double> d;
cout <<"c first" << c <<endl;
c = complex <double>(9,18); //可以构造无名对象赋值给d = complex <double>(3.14,-2);
cout <<"c sec" << c <<"real ="<<real(c) <<"image ="<<imag(c) <<endl;
d=c; //
cout <<"d first" <<d<<endl;
d = (-2); //结果就是d变成了(-2,0)
cout <<"d sec" <<d<<"real(d) ="<<real(d) <<"image(d)="<<imag(d) <<endl;
d = (4,2); //(4,-2)是逗号表达式,结果相当于(2).所以这里调用complex <double> ::operator=(const double & )
cout <<"d third" <<d<<"real(d) ="<<real(d) <<"image(d)="<<imag(d) <<endl;
system( "PAUSE");
补充傅里叶的一些问题:
// int sdf = log(btx) / log(2); 这个有bug 4096 应该是12,但是他是11 这个是自然数e打底
// int r = log10(btx) / log10(2); 这个正确 这是10打底
如果以上部分出错,会导致傅里叶转换的结果不能正确输出,因为下表会不准确.
我们在做傅里叶时候有时候会开辟数组
complex<double>* interVar1 = new complex<double>(countN);
complex<double>* interVar2 = new complex<double>(countN);
这个在里面还要delete []interVar1 ; delete []interVar2 ; 太麻烦,而且个人觉得会降低效率,同时遇到过没有给他赋初始值的情况下,会报内存泄漏,所以我都是在开辟的时候在后面加个(),这样可以让他初始值为0;
所以在已经数组个数的情况下在,为了保险起见,在上位机的程序中,我喜欢直接开辟程序空间和赋初始值
complex<double>* interVar1 = new complex<double>[countN]();
double s1[4096] = {0.0}; //养成定义就赋值的好习惯