一、单元数组的创建
单元数组是一种MATLAB数组,它的每一个元素是单元,在单元里可以存放各种类型的MATLAB数组。表3-1是 2 行 3 列单元数组的例子:
单元数组的创建可以通过对单元数组的赋值来创建单元数组,也可以对单元数组的预分配来创建。
对于单元数组预分配的书写格式为:
单元数组的赋值可以通过两种方式来进行:
(1)下标索引:用圆括号内的下标数来显示单位号,在等式右端用花括号把单元的内容括起来。例如一个2行2列的单元数组,赋值如下:
>> A(1,1)={magic(3)}; %在(1,1)单元里为3阶魔方矩阵
>> A(1,2)={'10/1/2004'}; %在(1,2)单元里为日期
>> A(2,1)={1:5}; %在(2,1)单元里,是1:5的行向量
>> A(2,2)={[1+2*i 2-3*i;2+3*i 1-2*i]}; %在(2,2)单元里,是复数矩阵
>> A
A =
2×2 cell 数组
[3×3 double] '10/1/2004'
[1×5 double] [2×2 double]
>> celldisp(A) %显示单元数组A的全部内容
A{1,1} =
8 1 6
3 5 7
4 9 2
A{2,1} =
1 2 3 4 5
A{1,2} =
10/1/2004
A{2,2} =
1.0000 + 2.0000i 2.0000 - 3.0000i
2.0000 + 3.0000i 1.0000 - 2.0000i
(2)单元索引:将单位数组的单元号用花括号括起来,在等式右侧写入单元的内容。
>> A{1,1}=magic(3);
>> A{1,2}='10/1/2004';
>> A{2,1}=1:5;
>> A{2,2}=[1+2*i 2-3*i;2+3*i 1-2*i];
>> celldisp(A)
A{1,1} =
8 1 6
3 5 7
4 9 2
A{2,1} =
1 2 3 4 5
A{1,2} =
10/1/2004
A{2,2} =
1.0000 + 2.0000i 2.0000 - 3.0000i
2.0000 + 3.0000i 1.0000 - 2.0000i
对于单元数组中,单元中的单元数组称为嵌套的单元数组或称为单元数组的子集。对于子集的赋值可以通过在两次单元索引的等式右侧赋值。
上述表3-1可以用以下语句赋值:
>> C=cell(2,3) %预设单元数组的大小
C =
2×3 cell 数组
[] [] []
[] [] []
>> C{1,1}=magic(3);
>> C{1,2}=strvcat('John Smith','3/8/2005','Class II');
>> C{1,3}=[2+i 1-2*i;1+2*i 2-i];
>> C{2,1}=[1.4 2.8 3.3 5.6];
>> C{2,2}=[2 3 4;3 6 10;4 10 20];
>> C{2,3}{1,1}='text'; %设置(2,3)单元的子集(1,1)内容
>> C{2,3}{1,2}=[4 2;1 5]; %设置(2,3)单元的子集(1,1)内容
>> C{2,3}{2,1}=[4 2 7]; %设置(2,3)单元的子集(2,1)内容
>> C{2,3}{2,2}=[0.5+6*i]; %设置(2,3)单元的子集(2,2)内容
>> C
C =
2×3 cell 数组
[3×3 double] [3×10 char ] [2×2 double]
[1×4 double] [3×3 double] {2×2 cell }
>> celldisp(C)
C{1,1} =
8 1 6
3 5 7
4 9 2
C{2,1} =
1.4000 2.8000 3.3000 5.6000
C{1,2} =
John Smith
3/8/2005
Class II
C{2,2} =
2 3 4
3 6 10
4 10 20
C{1,3} =
2.0000 + 1.0000i 1.0000 - 2.0000i
1.0000 + 2.0000i 2.0000 - 1.0000i
C{2,3}{1,1} =
text
C{2,3}{2,1} =
4 2 7
C{2,3}{1,2} =
4 2
1 5
C{2,3}{2,2} =
0.5000 + 6.0000i
>> cellplot(C) %用图形显示单元数组C的结构图
单元数组C的图形显示:
矩形表示向量元素或矩阵元素,标量或短的文本字符串则表示文本
二、单元数组的删除和改写
与一般数组类似,可以用赋值空矩阵来删除单元数组的某单元,亦可用reshape来改写矩阵。
例3-23
已知单元数组A={magic(3),‘10/1/2005’,‘name_wang’;[1 3 5 7],eye(3),’$5000’},要求删除单元{1,1},{2,1}和{2,2}。
>> A={magic(3),'10/1/2005','name_wang';[1 3 5 7],eye(3),'$5000'}
A =
2×3 cell 数组
[3×3 double] '10/1/2005' 'name_wang'
[1×4 double] [3×3 double] '$5000'
>> A{1,1}=[] %删除(1,1)单元
A =
2×3 cell 数组
[] '10/1/2005' 'name_wang'
[1×4 double] [3×3 double] '$5000'
>> A{2,1}=[] %删除(1,2)单元
A =
2×3 cell 数组
[] '10/1/2005' 'name_wang'
[] [3×3 double] '$5000'
>> A{2,2}=[] %删除(2,2)单元
A =
2×3 cell 数组
[] '10/1/2005' 'name_wang'
[] [] '$5000'
例3-24
已知单元数组A=cell(4,6),要求改写成 3 行 8 列的单元数组B,再取B矩阵的第4~8列组成单元数组C。
>> A=cell(4,6) %预分配单元数组A
A =
4×6 cell 数组
[] [] [] [] [] []
[] [] [] [] [] []
[] [] [] [] [] []
[] [] [] [] [] []
>> B=reshape(A,3,8) %改写成3行8列
B =
3×8 cell 数组
[] [] [] [] [] [] [] []
[] [] [] [] [] [] [] []
[] [] [] [] [] [] [] []
>> C=B(:,4:8) %取B的4~8列得单元数组C
C =
3×5 cell 数组
[] [] [] [] []
[] [] [] [] []
[] [] [] [] []
三、单元数组的运算
例3-25
已知单元数组A{1,1}=rand(2,3),A{2,1}=[1 3 5 7],A{1,2}=rand(3,2),A{2,2}=1:4,求单元元素的乘积A{1,1}*A{1,2}并存入A{1,3},以及单元元素的卷积conv(A{2,1},A{2,2})并存入A{2,3}。
>> A=cell(2,3)
A =
2×3 cell 数组
[] [] []
[] [] []
>> A{1,1}=rand(2,3);
>> A{1,2}=rand(3,2);
>> A{2,1}=[1 3 5 7];
>> A{2,2}=1:4;
>> A{1,3}=A{1,1}*A{1,2};
>> A{2,3}=conv(A{2,1},A{2,2});
>> A
A =
2×3 cell 数组
[2×3 double] [3×2 double] [2×2 double]
[1×4 double] [1×4 double] [1×7 double]
>> celldisp(A)
A{1,1} =
0.9572 0.8003 0.4218
0.4854 0.1419 0.9157
A{2,1} =
1 3 5 7
A{1,2} =
0.7922 0.0357
0.9595 0.8491
0.6557 0.9340
A{2,2} =
1 2 3 4
A{1,3} = %矩阵乘积
1.8027 1.1076
1.1211 0.9931
A{2,3} = %向量卷积
1 5 14 30 41 41 28