经过前面的熟悉、巩固,今天我们找一道Matlab中的典型例题,进行矩阵操作的强化训练。
例:建立单元矩阵B并回答下列问题。
y.a=1;
y.b=[1:3;4:6];
B{1,1}=1;
B{1,2}=Brenden;
B{2,1}=y;
B{2,2}={12,34,2;54,21,3;4,23,67};
(1)size(B)和ndims(B)的值分别是多少?
(2)B(2)和B(4)的值分别是多少?
(3)B(3)=[]和B{3}=[]执行后,B的值分别是多少?
解析:y.a=1;这种“变量+点+变量=值”的方式常为Matlab中“结构体”的直接赋值创建法。
在Matlab中,结构体数据类型,可以把不同数据类型的变量放到同一个变量名下,通过不同“域”的概念对结构体中的不同数据进行赋值操作。结构体中的数据存储在相应的“域”中。
因此“y.a=1;”、“y.b=[1:3;4:6];”在Matlab中表示创建一个名为y的结构体(struct),含有a、b两个属性,一个数值为1,一个为2*3的矩阵。
而“B{1,1}=1;”在Matlab中,通过“花括号赋值”的方法表示创建一个“元胞类型”(cell),第一个元素为1。元胞类型,在Matlab中可以包含任何类型的数据,如数值数组、字符、符号对象,甚至于其他的单元数组。实际上可以认为是一种以任意形式的数组为分量的多维数组。
因此“B{1,1}=1;”、“B{1,2}=Brenden;”、“B{2,1}=y;”、“B{2,2}={12,34,2;54,21,3;4,23,67};”表示,在Matlab中为一个2*2的元胞数组创建对应的“元胞元素”。
读懂题意后,我们便可来回答相应的问题:
答:(1)size(B)表示B的大小,ndims(B)表示B的维数。
可见B的大小为2*2的元胞数组(矩阵),B的维数为2。
(2)B(2)表示取B的第2个位置的子数组,B(4)表示取B的第4个位置的子数组,得到的结果仍然是元胞数组。
拓展:上步我们可以看到用“圆括号”取到的是对应位置的子数组,那么我们用”花括号“呢?由题中B的赋值过程,我们可知,B{2}的值就是结构体y,B{4}的值就是我们赋值的一个3*3的cell数组{12,34,2;54,21,3;4,23,67}。
总结:至此对“元胞数组”的取值我们可以总结为一句话“圆括号取数组,花括号取数值”。
(3)B(3)=[]表示删除B的第3个位置的数组,因此执行后,B变成了一个1*3的cell数组。
而B{3}=[]表示删除B的第3个位置的元素值,但数据结构仍在,因此执行后,B仍为2*2的cell数组,只是B的第3个位置的元素值为空。