MATLAB中坑爹的cell使用笔记汇总-自己备份
(2017-10-20 22:01:36)分类: MATLAB |
在MATLAB中,数值数组的存储单元内存储的数据类型必须是一模一样的,而且各元素的长度要一致(其它语言也是这样),即数值数组的存储单元内储存的数据必须是相同长度的数值类型。
cell也称为元胞,cell数组内可以存储不同类型的数据,这是它的精华之处,但缺点是经常坑爹!
一、cell数组的创建方法及实例
1 直接创建
1.1 利用若干单引号对及一对花括号直接创建一个cell数组
>> s1 = {'124','zifu','','15dgg'}
>> class(s1)
% 查看s1的类型
ans = cell
>> size(s1)
% 查看大小维数等
ans = 1 4
>> length(s1)
% 查看元素总数
ans = 4
或者这样
>> s2 = {'124';'zifu';'';'15dgg'}
>> class(s2)
% 查看s2的类型
ans = cell
>> size(s2)
% 查看大小维数等
ans = 4 1
>> length(s2)
% 查看行数和列数的最大值
ans = 4
也可以这样输入:两行两列矩阵形式
>> s231 = {'124','zifu','';'','15dgg','456'}
>> s232 =
{'124',rand(3,4),'';'','15dgg',rand(2,3)}
s232 =
1.2 直接输入cell数组中cell内容(方法1)
赋值符右边使用小括号访问cell地址,左边使用一对花括号加一对单引号对
>> s3(2,1) = {'21'}; s3(1,3) = {'zifu13'}; s3(2,2) =
{'zifu22'};s3(2,3) = {''}
s3 =
>> size(s3)
ans = 2 3
>> length(s3)
ans = 3
1.3 直接输入cell数组中cell内容(方法2)
赋值符右边使用一对花括号直接对cell元素直接赋值,左边使用一对单引号对
>> s4{1,2} = rand(3,4); s4{1,3} = 'zifu13'; s4{2,1} =
'21';
>> s4{2,2} = 'zifu22';s4{2,3} = rand(2,3)
s4 =
记忆技巧:cell数组直接赋值创建,花括号和小括号是左右同时对称出现的
例如:左边用了小括号(),那么右边必须用花括号{}指定cell内容了
1.4 利用cell(m,n)创建m行n列的空cell数组(矩阵)
>> s5 = cell(2,3)
>> s5(1,3) = rand(5)
% !!!错误:把一个内容赋值给cell对象,会导致类型转换错误
>> s5(1,3) = {rand(5)}
%
可以:表示s5的第1行第3列的cell对象赋值为{rand(5)}
>> s5{1,3} = rand(5)
% 可以:表示s5的第1行第3列的cell内容赋值为rand(5)
2 间接创建
可以类似数值数据或矩阵一样操作cell数组的部分,用冒号:运算符
>> sa = s4(1:2,2:3)
sa =
使用元胞的下标,可将一个元胞数组的子集赋值给另一个变量,创建新的元胞数组。
>> a=[{1},{2},{3};{4},{5},{6};{7},{8},{9}]
>> b=a(2:3,2:3)
>> c=a(1:3,2:3)
二、cell数组的读取
>> s4{2,3}
% 由于采用了随机数生成,每次运行s4{2,3}的结果会有差别
ans =
>> s4{2,3}(1,1)
ans = 0.1190
>> s4(2,3)
ans = [2x3 double]
三、元胞数组的删除和重塑
要删除单元数组中的行或列,可以用冒号表示单元数组中的行或列,然后对其赋一个空矩阵即可。
>> a={20,'matlab';ones(2,3),1:3}
>> a{1,:}=[]
%
!!!错误
>> a(1,:)=[]
%
删除a的第一行所有元素,变成1*2(沿用数值矩阵语法)
a = [2x3 double]
[1x3 double]
>> a{1} = []
%
给第一行第一个元素内容赋值为空,不是删除
a = []
[1x3 double]
>> a(1) = []
%
删除第一行第一个,删除
a = [1x3 double]
数中使用的函数ushuliang是有限的。
加或删除元胞数组中的元素。
>> a=cell(4,4)
>> b=reshape(a,2,8)
五、常用经验摘录:
cell不要用来存储太复杂的数据,主要用来存储一些长度不同的相同类型的向量就好
这样不会出现太多的坑爹的陷阱和错误
利用一个cell数组存储几个维数不同的向量,这个问题经常遇到。
例如第一个要存储9个数值,第二个要存储4个数值,在适当的时候还要读取里面的元素数值。
>> s = cell(1,5)
>> b1 = [1 2 3 4 0 0 4 7 8];s{1} = b1
>> b2 = [5 6 7 8];
>> s(2) = {b2} 或
>> s{2} = b2 % 效果一样(推荐用一种方式)
要读取数据5可以使用:
>> s{2}(1)
或代码分开使用
>> ts2 = s{2}; ts2(1)
另外,这样生成ts2也可以,但仅限于数值:
>> ts2 = cell2mat(s(2))
>> tt = s(1:2)
% 将s的前两个元赋给新的cell变量
>> class(s{1})
ans = double
>> class(s(1))
ans = cell
>> class(tt)
ans = cell