Page 322 - 《软件学报》2021年第6期
P. 322
1896 Journal of Software 软件学报 Vol.32, No.6, June 2021
Fig.17 Implementation principle of the MM_eq function
图 17 MM_eq 函数的实现原理
3.3 分块矩阵函数定义
本节主要介绍了分块矩阵函数的定义,由于第 2.3 节中定义的矩阵运算函数具有多态性,分块矩阵的函数
可以利用其多态性进行构造.但并不是所有的分块矩阵运算函数都可以通过该方法定义,例如分块矩阵的乘法
函数以及转置函数.在下面部分,我们将讨论为什么无法通过上述方式构造以及我们的解决方法.
分块矩阵的加减法实现原理如下:
⎛ A 11 ... A 1n ⎞ ⎛ B 11 ... B 1n ⎞ ⎛ A ± 11 B 11 ... A ± 1n B 1n ⎞
⎜ ⎟ ⎜ ⎟ ⎜ ⎟
⎜ # % # ⎟ ± ⎜ # % # ⎟ = ⎜ # % # ⎟
⎜ ⎟ ⎜ ⎟ ⎜ A ± A ± ⎟
⎝ A m 1 ... A mn ⎠ ⎝ B m 1 ... B mn ⎠ ⎝ m 1 B m 1 ... mn B mn ⎠
分块矩阵加减法的实现,可以利用矩阵函数 matrix_each 的多态性直接实现.matrix_each 函数具有 6 个参数,
分别是元素类型、元素运算函数、矩阵高度、矩阵宽度以及两个相同大小的矩阵.该函数的主要功能是将两个
矩阵中相应位置的元素一一代入提供的运算函数,从而生成一个新的矩阵.当我们构造分块矩阵加法或减法时,
可以通过输入矩阵类型、矩阵加法即可生成一个分块矩阵加/减法函数.具体分块矩阵加法函数定义如下:
Definition MMadd:=@matrix_each (Mat A m n) (@matrix_each A add m n).
同理,分块矩阵取负函数可由矩阵函数 matrix_map 的多态性直接实现,具体定义如下:
Definition MMopp m n:=@matrix_map (Mat A m n) (matrix_map A opp).
分块矩阵转置原理是将分块矩阵以矩阵为元素进行转置后再对内部元素一一转置,具体如下:
⎛ A 11 ... A 1n ⎞ T ⎛ A 11 T ... A m 1 T ⎞
⎜ ⎟ ⎜ ⎟
⎜ # % # ⎟ = ⎜ # % # ⎟
⎜ ⎟ ⎜ T T ⎟
⎝ A m 1 ... A mn ⎠ ⎝ A 1n ... A mn ⎠
在矩阵形式化部分,我们所定义的矩阵转置函数 trans 具有的 5 个参数分别是元素类型、缺省值、矩阵高
度、矩阵宽度以及输入矩阵,该函数主要作用是将矩阵进行转置.但如果我们直接使用该函数作为分块矩阵的
转置函数,会出现由于缺少内部矩阵转置操作而产生错误结果的现象,具体函数定义如下:
Definition MMtrans:=trans (Mat A m n) (MO A m n).
利用该函数对分块矩阵操作后产生结果如下:
MMtrans:
⎛ A 11 ... A 1n ⎞ A 11 ... A m 1 ⎞ ⎛ ⎛ A 11 T ... A m 1 T ⎞
⎜ ⎟ ⎟ ⎜ ⎜ ⎟
⎜ # % # ⎟ = # % # ⎟ ≠ ⎜ ⎜ # % # ⎟
⎜ ⎟ ⎜ ⎟ ⎜ T T ⎟
⎝ A m 1 ... A mn ⎠ ⎝ A 1n ... A mn ⎠ ⎝ A 1n ... A mn ⎠
因此,该 MMtrans 所产生的转置结果不等于分块矩阵转置的结果,原因在于其内部分块没有转置.面对这个
问题,我们构造新的转置函数 mmtrans,在实现对分块矩阵整体转置的同时,对其内部分块进行转置.我们提出了
一个新的递归函数 mhead,该函数与 List 库中 head 函数相似,不同之处在于:其对由矩阵类型构成的表取头元素