一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

在数字图像处理领域,复数这一类型会被经常使用到。但是在C++和Qt中都没有可以使用的复数类。为了今后的方便,我们可以自己定义一个C++复数类,以便将来使用。

一、复数的属性

复数包含实数部分和虚数部分,如果直接使用 a + ib 的模式会使得后面的一系列操作变得较为复杂。这里我们直接给复数定义两个成员变量 m_rl 和 m_im。

1 public:
2     double m_rl,m_im;

二、我们同样需要构造函数来初始化复数实例

1 public:
2     ComplexNumber(double rl,double im);
3     ComplexNumber();

它们的实现如下:

 1 ComplexNumber::ComplexNumber()
 2 {
 3     m_rl = 0;
 4     m_im = 0;
 5 }
 6 
 7 ComplexNumber::ComplexNumber(double rl, double im)
 8 {
 9     m_rl = rl;
10     m_im = im;
11 }

三、现在我们给复数加上算术运算的功能

在复数的头文件中加入下述代码:

 1 public:
 2 
 3     // 重载四则运算符号
 4 
 5     //
 6     ComplexNumber operator +(const ComplexNumber &c){
 7         return ComplexNumber(m_rl+c.m_rl,m_im+c.m_im);
 8     }
 9 
10     //
11     ComplexNumber operator -(const ComplexNumber &c){
12         return ComplexNumber(m_rl-c.m_rl,m_im-c.m_im);
13     }
14 
15     //
16     ComplexNumber operator *(const ComplexNumber &c){
17         return ComplexNumber(m_rl*c.m_rl-m_im*c.m_im,
18                              m_rl*c.m_im+m_im*c.m_rl);
19     }
20 
21     //
22     ComplexNumber operator /(const ComplexNumber &c) {
23             if ((0==c.m_rl) && (0==c.m_im)) {
24                 qDebug()<<"ERROR: divider is 0!";
25                 return ComplexNumber(m_rl, m_im);
26             }
27 
28             return ComplexNumber((m_rl*c.m_rl + m_im*c.m_im) / (c.m_rl*c.m_rl + c.m_im*c.m_im),
29 
30                 (m_im*c.m_rl - m_rl*c.m_im) / (c.m_rl*c.m_rl + c.m_im*c.m_im));
31 
32         }

四、其他函数

1.设定复数值

1 void SetValue(double rl, double im); // 定义
2 void ComplexNumber::SetValue(double rl, double im) // 实现
3 {
4     m_rl = rl;
5     m_im = im;
6 }

2.取模

1 double get_mold(); // 定义
2 double ComplexNumber::get_mold() // 实现
3 {
4     double mold;
5     mold = sqrt(m_rl*m_rl+m_im*m_im);
6     return mold;
7 }

至此,复数的实现就完成了。

posted on 2022-02-21 13:35  一杯清酒邀明月  阅读(753)  评论(0编辑  收藏  举报