您的位置:首页 > 编程语言 > C语言/C++

C++中complex应用的一些问题总结以及傅里叶的一些细节

2018-01-16 10:58 531 查看
说明: 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};  //养成定义就赋值的好习惯
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: