如果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);%预分配
2010-11-08 12:05:24 zz: http://hi.baidu.com/hbwc/blog/item/a89ec511ab669a1bb8127b5c.htm
元胞数组: 元胞数组是MATLAB的一种特殊数据类型,可以将元胞数组看做一种无所不包的通用矩阵,或者叫做广义矩阵。组成元胞数组的元素可以是任何一种数据类型的常数或者常量,每一个元素也可以具有不同的尺寸和内存占用空间,每一个元素的内容也可以完全不同,所以元胞数组的元素叫做元胞(cell)。和一般的数值矩阵一样,元胞数组的内存空间也是动态分配的。 (1)元胞数组的创建
>> a={'matlab',20;ones(2,3),1:10} a = 'matlab' [ 20] >> b=[{'matlab'},{20};{ones(2,3)},{1:10}] b = 'matlab' [ 20] >> c={10} c = [10] >> c(1,2)={2} c = [10] [2] >> c(2,2)={5} c = [10] [2] >> isequal(a,b) ans = 1 >> whos a 2x2 388 cell 用cell函数创建元胞数组,创建的数组为空元胞。cell函数创建空元胞数组的主要目的是为数组预先分配连续的存储空间,节约内存占用,提高执行效率。 >> a=cell(1) a = {[]} >> b=cell(1,2) b = [] [] >> c=cell(3,3) c = [] [] [] >> d=cell(2,2,2) d(:,:,1) = [] []
[] [] >> whos a 1x1 4 cell (2)元胞数组的数据获得 从元胞数组中读取数据,可保存为一个标准的数组或一个新的单元数组,或取出数组进行计算。元胞数组中数据的访问,可通过元胞内容的下标进行,用元胞数组名加大括号{}。大括号中数值表示元胞的下标。如a{1,2}表示元胞数组中第一行第二列的元胞。
a = [ 20] 'matlab' >> str=a(1,2) str = 'matlab' >> class(str) ans = cell >> str=a{1,2} str = matlab >> class(str) ans = char ()和{}有着本质的区别,大括号用于表示元胞的内容,小括号表示指定的元胞。
[ 20] 'matlab' >> 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] >> b=a(2:3,2:3) b = [5] [6] >> c=a(1:3,2:3) c = [2] [3] 本例使用元胞下标的方式创建了新的元胞数组b和c,通过结果看出b和c就是元胞数组a的一部分。 (3)元胞数组的删除和重塑 要删除单元数组中的行或列,可以用冒号表示单元数组中的行或列,然后对其赋一个空矩阵即可。
a={20,'matlab';ones(2,3),1:3} a = [ 20] 'matlab' >> a(1,:)=[] a = [2x3 double] [1x3 double] >> a={20,'matlab';ones(2,3),1:3}; a = [] 'matlab' >> a(1)=[] a = [2x3 double] 'matlab' [1x3 double] >> a(2)=[] a = [2x3 double] [1x3 double] >> a(1,2)=[] >> a(1)=[] a = [1x3 double] 元宝数组和其他数组一样,也可以通过reshape函数改变形状,改变后的元胞数组与原元胞数组的元素个数相同,不能通过改变形状来添加或删除元胞数组中的元素。
>> a=cell(4,4) a = [] [] [] [] >> size(a) ans = 4 4 >> b=reshape(a,2,8) b = [] [] [] [] [] [] [] [] >> size(b) ans = 2 8
(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] >> b=cellfun('isreal',a) b = 1 1 0 >> c=cellfun('length',a) c = 1 6 1 >> d=cellfun('isclass',a,'double') d = 1 0 1 (函数的应用)
cellfun函数的主要功能是对元胞数组的元素(元胞)分别指定不同的函数,不过,能够在cellfun函数中使用的函数ushuliang是有限的。 能在cellfun中使用的函数: isempty:若元胞元素为空,则返回逻辑真 islogical:若元胞元素为逻辑类型,则返回逻辑真 isreal:若元胞元素为实数,则返回逻辑真 length:元胞元素的长度 ndims:元胞元素的维数 prodofsize:元胞元素包含的元素个数 (7)元胞数组的嵌套 元胞数组的元胞中包含其他的元胞数,称为嵌套元胞数组,没有嵌套结构的元胞则称为页元胞。使用嵌套的大括号或cell函数,或直接用赋值表达式,都可以创建嵌套单元数组,另外还可以访问嵌套元胞数组的子数组、元胞或元胞的元素。
>> a=cell(1,2) a = [] [] >> a(1,2)={cell(2,2)} a = [] {2x2 cell}
>> a(1,1)={magic(3)}; (8)元胞数组与数值数组间的转化 应用循环,可以将元胞数组转化为数值数组。
2010-11-08 12:06:44 zz: http://www.cnblogs.com/Lifehacker/archive/2010/05/15/matlab_cell_mode.html
Matlab Cell功能最近完成模式分类的作业,需要大量使用matlab,期间发现了一个问题,是matlab代码的复用程度。 在面向过程编程里, 基本的复用单位是函数,程序的复杂度籍此下放到函数的接口上。设计好函数间的接口,基本上就成功了一半。在面向对象编程里, 基本的复用单位是对象,对象使得数据具有了一定程度的自维护。而在matlab里, 我很长时间都没有找到方向,因为我搞不清楚复用的单位是什么。 matlab中,基本的单位是矩阵,针对矩阵系统有一大堆的函数供你调用。但是,想自己写程序还是有一定的麻烦的。for循环语句在matlab里似乎是一个禁忌,所有老师都敦敦告诫,不要轻易使用for。而函数调用也是同样的低效, 有兴趣的同学可以参见此文。那么我们应该基于什么模块进行复用呢? 答案是Cell模式。 Cell是matlab的一个特色功能,将一段代码以%%标记为cell以后,就可以重复执行了,相当于在命令行输入该代码块。以前,为了测试不同参数的结果,往往要用up arrow执行上一条指令。遇到需要多条指令的地方,就很容易出错。而算法又没有完善到可以封装成函数的地步,整天来回跑代码让人不堪其烦。通过cell模式,可以非常方便地在不同的代码块之间跳转,或重复执行一个代码块。 对于我来说,matlab中的编程越来越趋向于bash编程,所用到的语言只是起到一个粘合剂的作用,负责把系统内置的高性能函数组合起来。这种对语句块的复用方式能够快速地调试出需要的功能,有点类似传统的goto,但是可以一直观察着执行的结果,事前无须编译 ,也不用考虑函数的接口问题。当算法稳定下来,就可以考虑用一个接口轻易地封装成函数了。同时也可以直接保存为mfile供以后使用。
|