继续是《数据结构算法与应用:C++语言描述》,第四章数组和矩阵的笔记。本小节介绍矩阵的基本概念以及自定义一个类Matrix实现基本的矩阵操作。
矩阵
定义和操作
一个m×n的矩阵(matrix)是一个m行、n列的表,如下图所示,其中m和n是矩阵的维数。
对于矩阵来说,最常见的操作就是矩阵转置、矩阵加和矩阵乘。
一个m×n矩阵的转置矩阵是一个n×m的矩阵MT,它与M之间存在以下关系:
MT(i,j)=M(j,i)1≤i≤n,1≤j≤m仅当两个矩阵的维数相同时,即具有相同的行数和列数,才可以对两个矩阵求和。两个m×n矩阵A和B相加所得到的m×n矩阵C如下:
C(i,j)=A(i,j)+B(i,j)1≤i≤n,1≤j≤m仅当一个m×n矩阵A的列数与另一个q×p矩阵B的行数相同,即n=q,才可以执行矩阵乘法A∗B。其得到的m×p矩阵C满足以下关系:
C(i,j)=n∑k=1A(i,k) ∗ B(k,j)1≤i≤m,1≤j≤p矩阵加的代码实现如下
1 | template<class T> |
矩阵转置代码实现如下:
1 | template<class T> |
矩阵乘法的代码实现如下:
1 | template<class T> |
类Matrix
这里自定义一个类Matrix来实现矩阵的功能,在该类中,使用()来指定每个元素,并且各行和各列的索引值都是从1开始的。
其类定义如下:
1 | #ifndef MATRIX_H_ |
构造函数,复制构造函数以及赋值运算符的代码如下:
1 | template<class T> |
为了重载矩阵下标操作法(),使用了C++的函数操作符(),与数组的下标操作法[]不同的是,该操作符可以带任意数量的参数。对于一个矩阵来说,需要两个整数参数。如下所示
1 | template<class T> |
二元减法的代码如下,矩阵加法操作符,一元减法操作符,增值操作符和输出操作符的代码都比较类似。
1 | template<class T> |
矩阵乘法实现如下所示
1 | template<class T> |
更完整的例子可以查看我的Github
复杂性
当T是一个内部数据类型时,矩阵构造函数复杂性是O(1),当T是一个用户自定义类时,构造函数的复杂性是$O(rowscols),下标操作符的复杂性是\theta(1),乘法操作符的复杂性是O(rowscols*m.cols)$。