基于有限域的矩阵运算器
上一节,我们学会了如何include头文件,进行有限域上的编码操作。熟悉了最基础的域上操作。但实际应用开发中,涉及到大量的有限域运算,因此,这一节中,我们将上一节中最基本的运算推广到矩阵运算形式。而事实上,编解码操作本质上也就是进行了一系列的矩阵运算。
在这一节中,我们将设计实现一个有限域上的矩阵运算器,提供,矩阵加减,矩阵相乘,矩阵求逆,矩阵转置等操作。我相信这个工具会伴随你整个网络编码的学习历程。就我的经验来看,我经常需要使用这个工具进行一系列的测试。
矩阵运算器的设计
由于在上一节中,我们已经非常详细地介绍了如何构造一个MFC工程。因此,后面的介绍中,我们会逐步跳过这些基础知识的讲解。
1 建立MFC对话框应用程序;
2 调出工具箱,设计按照如下布局完成界面设计;
注:(1).1,2,3,4为Edit Control编辑按钮,5,6,7,8为button编辑按钮,9,10为Static Text编辑按钮。
(2). 2,3,4为点击后拖动右下角放大所得。
3 属性更改:
A. 1,2,3,4:
a. 1,2,3,4的属性ID分别改为IDC_Order,IDC_EditLeft,IDC_EditMiddle,IDC_EditRight(属性ID不一定要改为上述的那样,但应规范,易记,但改为相同的名称在代码移植时可以减少很多麻烦)。
b. 2,3,4:Want Return改为True。并把属性Multiline,Horizontal Scroll,Vertical Scroll依次改为true。
c. 添加变量,只写上变量名,把2,3,4的变量名写为m_Matrix, m_Matrix2, m_Matrix3。完成。
d. 1添加变量的方式类似,但也有所不同:
B. 5,6,7,8:
a. 分别把属性Caption改为Transpose,Inverse,Add,Multiply。
b. 分别把属性ID改为IDC_Transpose, IDC_Inverse, IDC_Add, IDC_Multiply。完成。
C. 9,10:
这两个框只需要把属性Caption的内容分别改为“Define the field size GF(2^m):”和“If you press the "Transpose" or the "Inverse", only the matrix in the left "edit" is used!”就可以了。
4 写程序代码:
这个计算器的所有代码都会打包好给使用者,这里讲解这些代码如何使用。
在写代码之前,先做一些准备工作:
(1). 添加变量:视图->类视图,调出类视图对话框,点击“Matrix Computing”前的小三角,右击“CMatrixComputingDlg”,“添加->添加变量”,只需要在变量名出写上变量名”nOperation“,回车即可。
(2). 添加函数:添加函数时只需要填写函数返回值类型和函数名就可以了。

(3). 编辑框介绍:
(4). 包含头文件:复制gf.h, gf.c 两个文件。打开Matrix Computing的文件夹,“Matrix Computing->Matrix Computing->粘贴”,返回VS代码编辑框,在最上边加上语句#include “gf.c”。
(5). 初始化:在initDialog函数体里面对一些变量进行初始化。
(6). 接下来是写代码:
a.先从刚刚添加的compute函数开始:
这个计算器中的代码都比较长,因此建议直接从给出的代码中复制过来,当然你也可以以抄写的方式完成代码的书写,这样也有利于对函数功能实现的了解。
在完成代码的书写后,可以看到编辑框右边有许多的红点,这是可以不用管,之后会一起解决。
b.Transpose:
回到界面编辑框,双击Transpose按钮,进入Transpose函数的代码书写界面,接着把代码书写进去。
剩余三个函数也以此方式完成。
Tips:(记两个编辑框输入的矩阵分别为A和B)
Transpose(转置)函数的实现方式为将行与列的元素进行交换,第m行第n个元素变为第m列第n个元素。
Inverse(逆运算)函数功能实现的方式为运用增广矩阵经初等变换从而得到逆矩阵。
Add(加法运算)函数功能实现的方式为矩阵A和矩阵B的同行同列元素进行加法运算所得即为结果矩阵的该行该列的元素。Add函数要求两个相加的矩阵的行数和列数分别相同。
Multiply(乘法运算)函数功能实现的方式为矩阵A的第m行元素乘以矩阵B的第n列元素并相加,所得作为个结果矩阵的第m行第n个元素。在运算过程中,元素相乘是指矩阵A的第m行第k个元素乘以矩阵B的第k个元素。Multiply函数要求矩阵A的列数和矩阵B的行数相同。
(7). 从给出的代码的最后复制整个Rank函数粘贴到你的代码中。
7 点击“本地windows调试器”
8. 生成软件
把Debug模式改为release模式,点击“本地windows调试器”。生成后就可以在文件夹的“release”文件夹中找到并直接使用生成的软件了。
Tips: 虽然VS集成环境各个版本一脉相承,但不同版本在细节上会有一些差异,如果你在编辑过程中遇到问题,可以尝试在自行学习,并寻找解决方法。
编程注意事项
- 将界面下方的文本框要设置为多行类型,这个需要在其属性内找到该项。
- 然后变量绑定,使得程序能够读取前端界面框里的数据。并且读入二维数组。
- Transpose最简单,就是将一个二维数组转置一下即可。
- Add也简单,就是将两个矩阵对应的位置相加。
- Multiply就是将两个矩阵相乘,必须满足的条件是第一个矩阵的列数,必须等于第二个矩阵的行数。
- 最复杂的就是求你过程,因为对一个矩阵进行求逆,必须要先判断该矩阵是否可逆,即求得该矩阵的秩。当该矩阵式方阵,并且满秩时才认为该矩阵可逆。判断矩阵是否可逆的办法是对该矩阵进行初等变换,将其转换为三角矩阵,之后判断其对角线是否全部非零,当对角线全部是非零元素时,则认为其为满秩矩阵。
- 求逆矩阵的原理,就是利用高斯消去法。对于的矩阵,弄一个同样为的单位矩阵作为其增广矩阵,然后连同增广矩阵一起进行高斯消元,当将其消成单位矩阵时,增广矩阵会随着一起变化,此时,增广矩阵就是矩阵的逆矩阵。建议大家仔细研读这个代码。有些封装好的函数可以直接移植到自己的项目中去。