MATLAB计算机视觉实战
上QQ阅读APP看书,第一时间看更新

1.1 矩阵操作与运算

矩阵是一种纯数学上的概念,严格遵循数学规则,运算规则主要遵循线性代数理论。从数学上看,定义由m×n个数xiji=1,2,…,m; j=1,2,…,n)排列成mn列的数表(如为mn列)为矩阵。

在MATLAB中,矩阵类型的数据以数组的形式存在,也属于一种有序的数据组织形式。因此,从概念上看,在MATLAB中,矩阵是数组的一种表现形式。所以,一维数组可看作向量,而二维或更高维度的数组可看作矩阵。

1.1.1 在MATLAB中生成矩阵

一般而言,在MATLAB中创建矩阵的方式有两种:一种与枚举式直接赋值法相似,直接使用赋值语句对枚举矩阵的每个元素进行赋值;另一种则是MATLAB库函数中提供的创建特殊矩阵的基本指令。

1.生成数值矩阵

1)实数值矩阵输入

任何矩阵(向量)都可以直接按行方式输入每个元素:同一行中的元素用逗号(,)或者用空格符分隔,且空格个数不限;不同的行用分号(;)分隔。所有元素处于一方括号([])内;当矩阵是多维(三维以上),且方括号内的元素是维数较低的矩阵时,会有多重方括号。图1.1.1、图1.1.2展示了如何输入一个矩阵。

图1.1.1 输入一个行矩阵

图1.1.2 输入一个3×3矩阵

经验分享:上面提到的逗号和分号在输入的时候要注意输入法状态,应该在“半角”及“英文标点”格式下输入标点符号,否则会提示出错,如图1.1.3所示。

图1.1.3 MATLAB提示输入字符出错

2)向量输入

向量可以看作一维矩阵,所以上述生成矩阵的方法同样也适用于生成向量。向量也可以通过如下方式生成:

X=X0:STEP:Xn %产生以X0为初始值,步长为STEP,终值不超过Xn的数值型向量。

经验分享

Xn是该向量的最后一个分量的界限,不一定是最后一个数;

当X0<Xn时,要求STEP>0;当X0>Xn时,要求STEP<0;

STEP省略时,STEP=1。

实例如图1.1.4所示。

图1.1.4 向量生成实例

3)利用函数生成矩阵

特殊矩阵的生成函数如表1.1.1所示。

表1.1.1 特殊矩阵的生成函数

图1.1.5为部分特殊矩阵生成函数的使用实例。

图1.1.5 部分特殊矩阵生成函数的使用实例

经验分享:对于同一个特殊矩阵生成函数而言,存在不同的版本,主要区别在于输入参数的不同。因此,为更好地使用这些特殊矩阵生成函数,用户可以通过help命令或直接查看MATLAB的帮助目录,更加详细深入地了解这些特殊矩阵生成函数。

4)创建多维数组

方法1:采用直接赋值法,如图1.1.6所示。

图1.1.6 采用直接赋值法生成多维矩阵

方法2:采用cat函数。

函数:cat

格式:A=cat(n,A1,A2,…,Am)

说明:n=1和n=2时分别构造[A1;A2]和[A1,A2],都是二维数组,而n=3时可以构造出三维数组。

使用cat函数生成多维矩阵的实例如图1.1.7所示。

图1.1.7 使用cat函数生成多维矩阵实例

2.如何生成复数矩阵

复数矩阵有两种生成方式,如图1.1.8和图1.1.9所示。

图1.1.8 复数矩阵的第一种生成方式

图1.1.9 复数矩阵的第二种生成方式

1.1.2 矩阵变形操作

在具体的矩阵运算过程中,用户可能遇到需要改变矩阵形态的情况,包括改变矩阵的大小甚至结构。具体来说,矩阵的变形主要有矩阵的旋转、矩阵维度的修改与矩阵元素的删除等。MATLAB提供了一系列可以改变矩阵大小与结构的库函数,如表1.1.2所示。

表1.1.2 矩阵变形操作的库函数

图1.1.10为矩阵变形操作的库函数使用演示。

图1.1.10 矩阵变形操作的库函数使用演示

经验分享:在表1.1.2中的reshape函数功能说明里提到的“线性索引”方式指的是,在MATLAB中,矩阵中的元素沿着从左到右、从上到下的列的方向依次编号,以这种编号方式寻访矩阵中每个元素的方式称为“线性索引”方式。此外,在使用cat函数的时候,必须确保矩阵A与矩阵B在拼接的维度dim上具有相同的长度,否则将产生错误。

1.1.3 矩阵的下标引用

元素操作是MATLAB矩阵操作的重要组成部分,下标引用为元素操作提供了必要的途径。在MATLAB中,一般二维矩阵元素的数字索引方式有两种:单下标索引和双下标索引。单下标索引方式是沿着矩阵列方向的,采用列元素优先的原则,自左向右、自上而下地为矩阵中的每个元素设定单下标索引值,如图1.1.11所示。双下标索引方式则是通过二元数对与二维矩阵元素在矩阵中的行列位置的对应关系对元素进行索引,如图1.1.12所示。

图1.1.11 单下标索引值排布方式

图1.1.12 双下标索引值排布方式

MATLAB提供了基于以上两种矩阵元素寻访方式的索引表达式,如表1.1.3所示。

表1.1.3 寻访矩阵元素的索引表达式

图1.1.13为寻访矩阵元素的索引表达式使用演示。

图1.1.13 寻找矩阵元素的索引表达式使用演示

经验分享:在图1.1.13中,示例A([1 2 3],end)中的end是MATLAB中的一个关键字,用于表示该维中的最后一个元素,在该示例中表示最后一列。读者可自行构建一个m×n矩阵A并在命令行窗口中分别输入A(1:m,2:n)与A(:,2:end),比较二者输出结果,从而体会关键字end在此处的含义。

1.1.4 获取当前矩阵信息

在某些情况下,参与运算的矩阵可能具有尺寸较庞大、结构较复杂、数据类型较多,甚至占用计算机内存较多等特点。为了能够有针对性地了解掌握矩阵的这些信息,MATLAB为用户提供了获取矩阵结构、矩阵尺寸、矩阵数据类型以及矩阵占用内存情况等方面信息的测试函数。

1.矩阵结构

矩阵结构指的是矩阵内部元素的排列方式。MATLAB提供了如表1.1.4所示用于测试矩阵结构的测试函数。

表1.1.4 矩阵结构测试函数

图1.1.14为矩阵结构测试函数的使用演示。

图1.1.14 矩阵结构测试函数的使用演示

2.矩阵尺寸

矩阵的尺寸信息包括矩阵维数、矩阵各维度的长度与矩阵元素的个数。MATLAB中为这三类信息提供了4个查询函数,如表1.1.5所示。

表1.1.5 矩阵尺寸信息查询函数

图1.1.15为矩阵尺寸信息查询函数的使用演示。

图1.1.15 矩阵尺寸信息查询函数的使用演示

3.矩阵元素类型

表1.1.6展示了矩阵元素类型的测试函数。

表1.1.6 矩阵元素类型测试函数

图1.1.16为矩阵元素类型测试函数的使用演示。

图1.1.16 矩阵元素类型测试函数的使用演示

4.矩阵占用内存情况

对于大型MATLAB程序而言,程序的执行效率与内存占用率是程序员所关注的问题,这对MATLAB程序性能的优化起到非常重要的作用。MATLAB为用户提供了whos指令,用于查看当前工作区中制定变量的所有信息,包括变量名、矩阵大小、内存占用情况、数据类型等信息。

1.1.5 矩阵运算

1.矩阵的加减运算

在MATLAB中,数值矩阵是一种特殊的数值数组。在进行矩阵加减运算的时候,参与运算的矩阵也需要遵循“维度相同”的规则,即具有相同的行数与列数。当矩阵与数值型数据之间进行加减法运算时,运算不需要遵循此规则,而是将矩阵的元素均与该数值型数据进行加减运算,并返回新矩阵。矩阵加减法运算演示如图1.1.17所示。

图1.1.17 矩阵加减法运算演示

经验分享:由图1.1.17的矩阵加减法运算演示中(A+C)-(C+A)示例的结果,可以得出矩阵的加减法运算满足交换律的结论。读者可以自行验证矩阵加减法是否满足结合律。

2.矩阵的乘法运算

MATLAB中矩阵的乘法运算遵循线性代数理论体系。在矩阵之间进行乘法运算时,尤其需要注意非方阵矩阵在维度上的匹配。矩阵乘法运算演示如图1.1.18所示。

图1.1.18 矩阵乘法运算演示

经验分享:如图1.1.18所示,矩阵与数值型数据之间的乘法运算满足分配律。此外,(A+C)×B-(A×B+C×B)的运算示例也反映出矩阵之间的乘法运算满足右分配律。对于两个矩阵的乘法运算A×C,由于矩阵A的列数3与矩阵C的行数2不相等,即矩阵A与矩阵C尽管在维度上相同,但是参与乘法运算时维度不匹配,因此造成了MATLAB编译错误。读者可以在保证矩阵维度匹配的前提下,自行检验矩阵乘法是否满足交换律与左结合律(即形如:A×(B+C)=A×B+A×C)。

3.矩阵的除法运算

MATLAB中的矩阵除法运算被细分为左除与右除运算。对于参与矩阵除法运算的两个对象A与B而言,若均为数值型标量,则左除与右除运算是等价的。然而,对于一般的二维矩阵A和B而言,左除与右除运算在对矩阵A和B的维度匹配上存在不同的要求,具体由图1.1.19的矩阵除法运算演示说明。

图1.1.19 矩阵除法运算演示

经验分享:由图1.1.19的矩阵除法运算演示,可以注意到矩阵A、B、C的维度分别为2×3,3×3,2×2。根据左除运算A\B是Ax=B的逆运算以及右除运算B/A是xA=B的逆运算的规则,可以归纳出左除与右除运算对运算矩阵在维度匹配上的不同要求:左除运算要求左矩阵的行数与右矩阵的行数相等,而右除运算要求左矩阵的列数与右矩阵的列数相等。因此,在进行右除运算A/B时,右除运算正常进行。如果将矩阵A转置以后再进行右除运算,则产生维度不匹配的错误。在进行左除运算B\A时,产生维度不匹配的错误,而左除运算C\A则顺利进行。

4.矩阵的幂运算

MATLAB中矩阵的幂运算对方阵有效,因为对于非方阵而言,相邻的运算矩阵无法满足“维度匹配”的要求,即左侧矩阵的列数不等于相邻右侧矩阵的行数,则幂运算无法进行。矩阵的幂运算演示如图1.1.20所示。

图1.1.20 矩阵幂运算演示

5.矩阵的转置

图1.1.21演示了求矩阵转置的运算。

图1.1.21 求矩阵转置的运算

6.方阵的行列式

函数:det

格式:d=det(X)

说明:返回方阵X的多项式的值。

执行过程见图1.1.22。

图1.1.22 求方阵的行列式

经验分享:若矩阵A的元素为实数,则与线性代数中矩阵的转置相同;若A为复数矩阵,则A转置后的元素由A对应元素的共轭复数构成。

7.矩阵的逆

函数:inv

格式:Y=inv(X)

说明:求方阵X的逆矩阵。若X为奇异阵或近似奇异阵,将给出警告信息。

执行过程见图1.1.23。

图1.1.23 求矩阵的逆

8.矩阵的迹

函数:trace

格式:b=trace(A)

说明:返回矩阵A的迹,即A的对角线元素之和。

执行过程见图1.1.24。

图1.1.24 求矩阵的迹

9.矩阵的秩

函数:rank

格式:k=rank(A)

说明:求矩阵A的秩。

执行过程见图1.1.25。

图1.1.25 求矩阵的秩

10.矩阵的特征值

函数:eig

格式:d=eig(A)

说明:求矩阵A的特征值d,以向量形式存放。

执行过程见图1.1.26。

图1.1.26 求矩阵的特征值

1.1.6 矩阵关系比较

矩阵的比较关系是针对两个矩阵对应元素的,所以在使用关系运算时,首先应该保证两个矩阵的维数一致或其中一个矩阵为标量。关系运算是对两个矩阵的对应运算进行比较,若关系满足,则将结果矩阵中该位置元素置为1,否则置0。

MATLAB的各种比较关系运算见表1.1.7,其应用举例见图1.1.27。

表1.1.7 MATLAB的各种比较关系运算

图1.1.27 矩阵比较示例

1.1.7 矩阵元素值取整

对于由小数构成的矩阵A来说,如果想对它取整数,有以下4种方法。

1.按-∞方向取整

函数:floor

格式:floor(A)

说明:将A中元素按-∞方向取整,即取不足整数。

2.按+∞方向取整

函数:ceil

格式:ceil(A)

说明:将A中元素按+∞方向取整,即取过剩整数。

3.四舍五入取整

函数:round

格式:round(A)

说明:将A中元素按最近的整数取整,即四舍五入取整。

4.按离0近的方向取整

函数:fix

格式:fix(A)

说明:将A中元素按离0近的方向取整。

图1.1.28为对矩阵的元素进行取整。

图1.1.28 对矩阵的元素进行取整

1.1.8 对矩阵进行逻辑运算

1.与运算

格式:A&B或and(A,B)

说明:A与B对应元素进行与运算,若两个数均非0,则结果元素的值为1,否则为0。

2.或运算

格式:A|B或or(A,B)

说明:A与B对应元素进行或运算,若两个数均为0,则结果元素的值为0,否则为1。

3.非运算

格式:~A或not(A)

说明:若A的元素为0,则结果元素为1,否则为0。

4.异或运算

格式:xor(A,B)

说明:A与B对应元素进行异或运算,若相应的两个数中一个为0,一个非0,则结果为0,否则为1。

图1.1.29为对矩阵进行逻辑运算。

图1.1.29 对矩阵进行逻辑运算

1.1.9 矩阵分解

1.LU分解

矩阵的三角分解又称LU分解,它的目的是将一个矩阵分解成一个下三角矩阵L和一个上三角矩阵U的乘积,即A=LU。

函数:lu

格式:[L,U]=lu(X)

图1.1.30为对矩阵进行LU分解。

图1.1.30 对矩阵进行LU分解

2.QR分解

矩阵的QR分解是将矩阵分解成一个正交矩阵与一个上三角矩阵的乘积。

函数:qr

格式:[Q,R]=qr(A)

图1.1.31为对矩阵进行QR分解。

图1.1.31 对矩阵进行QR分解

1.1.10 查找矩阵中的最值

用max函数和min函数可以查找矩阵中的最值,这两个函数的具体使用方法如表1.1.8所示。其使用举例如图1.1.32所示。

表1.1.8 max函数和min函数使用方法

图1.1.32 max函数和min函数使用

1.1.11 查找矩阵中的元素

在MATLAB中,可以调用find函数在矩阵中查找满足一定条件的元素,find函数的调用格式为

ind=find(X)

[m n]=find(X)

其中,X为要查找的矩阵;ind为要查找元素在矩阵X中的线性索引值。在MATLAB中,矩阵是按照列存储的,ind的值表示元素在矩阵中按列存储时位置的索引值。m和n是列向量,分别保存元素在矩阵中位置的行下标和列下标。

find函数的使用方法如图1.1.33所示。

图1.1.33 find函数的使用方法