3.1.2 数据结构

3.1.2 数据结构

在MATLAB的数据结构中,需要特别注意的是Matrix。前面已提过,MATLAB将所有的数据都按矩阵来处理,因此,Matrix是MATLAB最基本的数据结构。

Matrix相当于其他编程语言中的数组,但MATLAB为矩阵定义了许多非常方便的操作和大量的运算,使矩阵用起来比一般的数组方便很多。

对于Matrix,以下几个方面的问题需要特别注意。

(1)矩阵元素索引

假设有一个如下式所示的矩阵。

在MATLAB中可以用下面的方法生成:

1)一个元素的索引

MATLAB对单个元素的索引有两种方法:双指标索引和单指标索引。

双指标索引的格式为:A(i,j),i为行号,j为列号。如输入

输出为

再输入

输出为

单指标索引的格式为:A(m),m为矩阵中元素的序号。MATLAB的矩阵是按列存储的,因此,元素的序号排序方式为:A(1,1),A(2,1),A(3,1),A(1,2),A(2,2),A(3,2),A(1,3),A(2,3),A(3,3)。所 以,输入

输出为

再输入

输出为

2)一行(列)元素的索引——“:”的作用

冒号“:”在MATLAB矩阵索引中可以代替一行或一列,用法如下。

如输入

输出为

A(1,:)表示第1行、所有的列。

如输入

输出为

A(:,3)表示所有的行、第3列。

单指标索引中的冒号表示所有的元素(按列排序),如输入

输出为

3)一块元素的索引

有时需要索引矩阵的一部分,如A的左上角的2×2主矩阵,这时可以采取矢量指标的形式。如输入

输出为

指标中的写法是MATLAB中的循环写法,a∶b∶c的意思是,a为起始值,b为步长,c为终止值。

A(1∶2,1∶2)表示取A的一部分,行号限制为第1、2行,列号限制为第1、2列。A(1∶2,1∶2)等价于A([1 2],[1,2])。如输入

输出为

A(1∶2∶3,1∶2)表示取A的一部分,行号限制为第1、3行,列号限制为第1、2列。A(1∶2∶3,1∶2)等价于A([1 3],[1 2])。

此外,还有一个重要的变量是end,它表示目前正在操作的矩阵的行或列或元素序号的最大值。如输入

输出为

再输入

输出为

再输入

输出为

当矩阵的维数比较大,或者根本不知道矩阵的维数时,end是一种很方便的用法。

尽管如此,很多时候还必须知道矩阵的维数,这时可以用size函数。对于size函数的具体用法,读者可以自己查看“Help”。有两种用法需要熟练掌握:

D = SIZE(X)

此种调用格式返回矩阵X的维数信息。D(1)为矩阵的第一维大小信息(若X为二维矩阵,则为行数),D(2)为矩阵的第二维大小信息(若X为二维矩阵,则为列数),依此类推。

M = SIZE(X,DIM)

此种调用格式返回矩阵X的第DIM维大小信息。

只要熟练掌握了矩阵的索引技术,对矩阵的操作就很方便了。

例2:左右颠倒一个矩阵。

使用这个功能方便地实现一个图像的镜像。

例3:某战斗机的图像如图3-2 (a)所示,文件名为“warcraft.jpg”。用下面的代码可实现该图像的镜像,如图3-2 (b)所示。

图3-2 图像的镜像示意

(a)原图像;(b)镜像 图像

(2)矩阵生成

1)赋值

有了上面索引的知识,对矩阵赋值就是很容易的事情了。如

也可以对一行或一列或一块赋值,如

对整个矩阵的赋值,如

分号表示换行,因此

2)组合

除了赋值外,也可以将两个矩阵组合起来生成一个新的矩阵。

例4:用叠加的方法生成新矩阵。

还有一个关于矩阵生成的函数是repmat。该函数可以将一个小矩阵重复后生成一个大矩阵[2]

例5:用repmat生成新矩阵。

3)函数生成

对于一些元素有规律的矩阵,如例4中的元素全为1的B矩阵,MATLAB提供了专门的函数用来生成这些矩阵。

MATLAB中有关矩阵生成的函数及其功能见表3-1。

表3-1 MATLAB矩阵生成函数

当使用者在生成一个矩阵后,还可以使用reshape命令重新调整矩阵的行数、列数、维数。具体用法为B = reshape(A,m,n),其中A为原矩阵,m、n为使用者希望重新调整的行数和列数,B为调整后的新矩阵。但是一定要注意的是,重新调整的行数和列数的乘积必须等于原矩阵行数和列数的乘积,否则就会出错。

例6:reshape函数使用举例。

(3)强大的cell

MATLAB中还有一种重要的数据结构,即cell。cell应该称为一种广义的矩阵,它和Matrix的根本区别是:Matrix中各个元素的数据类型必须一致,而cell中的数据元素的数据类型可以不一样。

例7:cell型数据结构举例。

可见,d是一个cell型结构,其中的3个元素分别为1个3×3的矩阵、1个字符串和1个 nan。

区别于Matrix用中括号[]表示、用小括号()引用,cell结构的表示和引用全用大括号。

例8:判断一个变量是否是nan。

d{3}实际就是变量c,isnan()是判断一个变量是否是nan的函数,其输出结果为1。

由于可以将不同类型的数据存储在一个cell变量中,因此,cell成为MATLAB非常强大的数据打包工具。在某些场合,如函数间传递参数时,使用cell可以大大简化函数的形式。