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}; //养成定义就赋值的好习惯
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}; //养成定义就赋值的好习惯
相关文章推荐
- 表格和伪选择器的综合应用以及一些细节问题
- 一些Windows API导致的Crash以及使用问题总结
- pig函数以及关键字 的一些实例应用的总结(来自pig笔记)
- sqlite基础总结 以及QT连接sqlite的一些问题
- 最近一年做Android项目过程中,对其的一些注意事项(优化)以及问题总结(一)
- 本文简述了Ajax技术适用场景、Ajax不适用场景的具体情况以及应用时候存在的一些问题。
- 总结网页设计中的一些比较突出的细节问题
- 一个简单的安卓小应用,开发步骤以及遇到的各种问题总结
- Android应用中使用Fragment组件的一些问题及解决方案总结
- NET中应用SQL参数化时当要注意的一些细节问题
- iOS开发之适配IPV6更新网络处理为AFNetworking3.x, 集成以及遇到的一些问题总结。
- [Java面试五]Spring总结以及在面试中的一些问题.
- 一些不熟悉的细节问题总结帖
- 数据结构(4)--循环链表的应用之约瑟夫环问题以及线性表总结之顺序表与链表的比较
- 最近一年做Android项目过程中,对其的一些注意事项(优化)以及问题总结(二)
- clistctrl知识点总结、文件打开弹框以及一些小问题的解决
- iOS开发中遇到的一些问题以及解决办法总结
- 一些Windows API导致的Crash以及使用问题总结
- Android 开发中的遇到的一些细节问题总结
- 一些Windows API导致的Crash以及使用问题总结