MATLABCell函数使用技巧.docx
- 文档编号:3427412
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:10
- 大小:18.34KB
MATLABCell函数使用技巧.docx
《MATLABCell函数使用技巧.docx》由会员分享,可在线阅读,更多相关《MATLABCell函数使用技巧.docx(10页珍藏版)》请在冰豆网上搜索。
MATLABCell函数使用技巧
+MATLABCell函数使用技巧
谈谈MATLAB中cell函数
如果p为一个数,那么h
(1)=p,是没有问题的。
如果p为一个向量,那么h(1,:
)=p是没有问题的。
如果p是一个矩阵的话,上面的两种赋值方法都是会有错误的。
那么要如何处理呢?
这时就用到了cell数据类型了。
cell的每个单元都可以存储任何数据,比如传递函数等。
当然,存储矩阵更是没有问题的了。
但是用cell数据类型之前,要先初始化。
a=cell(n,m)
那么就把a初始化为一个n行m列的空cell类型数据。
如何赋值呢?
a{1,1}=rand(5)
那么a的1行1列的单元中存储的就是一个随机的5×5的方阵了。
那么要用第一个单元中的方阵中的某个值呢?
可以如下引用:
a{1,1}(2,3)
就可以了,引用cell单元时要用{},再引用矩阵的某个数据就要用()了。
cell单元中的每个单元都是独立的,可以分别存储不同大小的矩阵或不同类型的数据。
下面举个例子:
a=cell(2,2);%预分配
a{1,1}='cellclass';
a{1,2}=[122];
a{2,1}=['a','b','c'];
a{2,2}=[956];
>>a{1,1}
ans=
cellclass
>>a{1,2}
ans=
122
>>a{2,:
}
ans=
abc
ans=
956
>>b=a{1,1}
b=
cellclass
2010-11-0812:
05:
24
zz:
元胞数组:
元胞数组是MATLAB的一种特殊数据类型,可以将元胞数组看做一种无所不包的通用矩阵,或者叫做广义矩阵。
组成元胞数组的元素可以是任何一种数据类型的常数或者常量,每一个元素也可以具有不同的尺寸和内存占用空间,每一个元素的内容也可以完全不同,所以元胞数组的元素叫做元胞(cell)。
和一般的数值矩阵一样,元胞数组的内存空间也是动态分配的。
(1)元胞数组的创建
>>a={'matlab',20;ones(2,3),1:
10}
a=
'matlab'[20]
[2x3double][1x10double]
>>b=[{'matlab'},{20};{ones(2,3)},{1:
10}]
b=
'matlab'[20]
[2x3double][1x10double]
>>c={10}
c=
[10]
>>c(1,2)={2}
c=
[10][2]
>>c(2,2)={5}
c=
[10][2]
[][5]
>>isequal(a,b)
ans=
1
>>whos
NameSizeBytesClassAttributes
a2x2388cell
ans1x11logical
b2x2388cell
c2x2208cell
用cell函数创建元胞数组,创建的数组为空元胞。
cell函数创建空元胞数组的主要目的是为数组预先分配连续的存储空间,节约内存占用,提高执行效率。
>>a=cell
(1)
a=
{[]}
>>b=cell(1,2)
b=
[][]
>>c=cell(3,3)
c=
[][][]
[][][]
[][][]
>>d=cell(2,2,2)
d(:
:
1)=
[][]
[][]
d(:
:
2)=
[][]
[][]
>>whos
NameSizeBytesClassAttributes
a1x14cell
ans1x11logical
b1x28cell
c3x336cell
d2x2x232cell
(2)元胞数组的数据获得
从元胞数组中读取数据,可保存为一个标准的数组或一个新的单元数组,或取出数组进行计算。
元胞数组中数据的访问,可通过元胞内容的下标进行,用元胞数组名加大括号{}。
大括号中数值表示元胞的下标。
如a{1,2}表示元胞数组中第一行第二列的元胞。
>>a={20,'matlab';ones(2,3),1:
3}
a=
[20]'matlab'
[2x3double][1x3double]
>>str=a(1,2)
str=
'matlab'
>>class(str)
ans=
cell
>>str=a{1,2}
str=
matlab
>>class(str)
ans=
char
()和{}有着本质的区别,大括号用于表示元胞的内容,小括号表示指定的元胞。
a=
[20]'matlab'
[2x3double][1x3double]
>>a{2,1}(2,2)
ans=
0.9134
>>a{2,1}(2,3)
ans=
0.0975
>>a{1,2}
(2)
ans=
a
使用元胞的下标,可将一个元胞数组的子集赋值给另一个变量,创建新的元胞数组。
>>a=[{1},{2},{3};{4},{5},{6};{7},{8},{9}]
a=
[1][2][3]
[4][5][6]
[7][8][9]
>>b=a(2:
3,2:
3)
b=
[5][6]
[8][9]
>>c=a(1:
3,2:
3)
c=
[2][3]
[5][6]
[8][9]
本例使用元胞下标的方式创建了新的元胞数组b和c,通过结果看出b和c就是元胞数组a的一部分。
(3)元胞数组的删除和重塑
要删除单元数组中的行或列,可以用冒号表示单元数组中的行或列,然后对其赋一个空矩阵即可。
a={20,'matlab';ones(2,3),1:
3}
a=
[20]'matlab'
[2x3double][1x3double]
>>a(1,:
)=[]
a=
[2x3double][1x3double]
>>a={20,'matlab';ones(2,3),1:
3};
>>a{1}=[]
a=
[]'matlab'
[2x3double][1x3double]
>>a
(1)=[]
a=
[2x3double]'matlab'[1x3double]
>>a
(2)=[]
a=
[2x3double][1x3double]
>>a(1,2)=[]
?
?
?
Anullassignmentcanhaveonlyonenon-colonindex.
>>a
(1)=[]
a=
[1x3double]
元宝数组和其他数组一样,也可以通过reshape函数改变形状,改变后的元胞数组与原元胞数组的元素个数相同,不能通过改变形状来添加或删除元胞数组中的元素。
>>a=cell(4,4)
a=
[][][][]
[][][][]
[][][][]
[][][][]
>>size(a)
ans=
44
>>b=reshape(a,2,8)
b=
[][][][][][][][]
[][][][][][][][]
>>size(b)
ans=
28
(5)元胞数组中的操作函数
cell:
创建空的元胞数组
cellfun:
为元胞数组的每个元胞执行指定的函数
celldisp:
显示所有元胞的内容
cellplot:
利用图形方式显示元胞数组
cell2mat:
将元胞数组转变成为普通的矩阵
mat2cell:
将数值矩阵转变成为元胞数组
num2cell:
将数值数组转变成为元胞数组
deal:
将输入参数赋值给输出
cell2struct:
将元胞数组转变成为结构
struct2cell:
将结构转变为元胞数组
iscell:
判断输入是否为元胞数组
>>a={20,'matlab',3-7i;ones(2,3),1:
3,0}
a=
[20]'matlab'[3.0000-7.0000i]
[2x3double][1x3double][0]
>>b=cellfun('isreal',a)
b=
110
111
>>c=cellfun('length',a)
c=
161
331
>>d=cellfun('isclass',a,'double')
d=
101
111
(函数的应用)
cellfun函数的主要功能是对元胞数组的元素(元胞)分别指定不同的函数,不过,能够在cellfun函数中使用的函数ushuliang是有限的。
能在cellfun中使用的函数:
isempty:
若元胞元素为空,则返回逻辑真
islogical:
若元胞元素为逻辑类型,则返回逻辑真
isreal:
若元胞元素为实数,则返回逻辑真
length:
元胞元素的长度
ndims:
元胞元素的维数
prodofsize:
元胞元素包含的元素个数
(7)元胞数组的嵌套
元胞数组的元胞中包含其他的元胞数,称为嵌套元胞数组,没有嵌套结构的元胞则称为页元胞。
使用嵌套的大括号或cell函数,或直接用赋值表达式,都可以创建嵌套单元数组,另外还可以访问嵌套元胞数组的子数组、元胞或元胞的元素。
>>a=cell(1,2)
a=
[][]
>>a(1,2)={cell(2,2)}
a=
[]{2x2cell}
>>a(1,1)={magic(3)};
a{1,2}(1,1)={[123;456;789]};
a{1,2}(2,1)={[2-i;4+7i]};
a{1,2}(2,2)={cell(1,2)};
a{1,2}{2,2}
(2)={5};
>>cellplot(a)
(8)元胞数组与数值数组间的转化
应用循环,可以将元胞数组转化为数值数组。
2010-11-0812:
06:
44
zz:
MatlabCell功能
最近完成模式分类的作业,需要大量使用matlab,期间发现了一个问题,是matlab代码的复用程度。
在面向过程编程里,基本的复用单位是函数,程序的复杂度籍此下放到函数的接口上。
设计好函数间的接口,基本上就成功了一半。
在面向对象编程里,基本的复用单位是对象,对象使得数据具有了一定程度的自维护。
而在matlab里,我很长时间都没有找到方向,因为我搞不清楚复用的单位是什么。
matlab中,基本的单位是矩阵,针对矩阵系统有一大堆的函数供你调用。
但是,想自己写程序还是有一定的麻烦的。
for循环语句在matlab里似乎是一个禁忌,所有老师都敦敦告诫,不要轻易使用for。
而函数调用也是同样的低效,有兴趣的同学可以参见此文。
那么我们应该基于什么模块进行复用呢?
答案是Cell模式。
Cell是matlab的一个特色功能,将一段代码以%%标记为cell以后,就可以重复执行了,相当于在命令行输入该代码块。
以前,为了测试不同参数的结果,往往要用uparrow执行上一条指令。
遇到需要多条指令的地方,就很容易出错。
而算法又没有完善到可以封装成函数的地步,整天来回跑代码让人不堪其烦。
通过cell模式,可以非常方便地在不同的代码块之间跳转,或重复执行一个代码块。
对于我来说,matlab中的编程越来越趋向于bash编程,所用到的语言只是起到一个粘合剂的作用,负责把系统内置的高性能函数组合起来。
这种对语句块的复用方式能够快速地调试出需要的功能,有点类似传统的goto,但是可以一直观察着执行的结果,事前无须编译,也不用考虑函数的接口问题。
当算法稳定下来,就可以考虑用一个接口轻易地封装成函数了。
同时也可以直接保存为mfile供以后使用。
本文来自CSDN博客,转载请标明出处:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MATLABCell 函数 使用 技巧
![提示](https://static.bdocx.com/images/bang_tan.gif)