如题所述
第1个回答 推荐于2016-05-08
使用方法 c = cell(n) 创建n*n个空矩阵的元胞数组。如果参数n不是标量,就会报错。 c = cell(m, n)或c = cell([m, n]) 创建m*n个空矩阵的元胞数组。参数m和n必须为标量。 c = cell(m, n, p,...)或c = cell([m n p ...]) 创建m*n*p*...个空矩阵的元胞数组,参数m,n,p,...必须为标量。 《Simulink与信号处理》 c = cell(size(A)) 创建一个元胞数组,它包含与矩阵A同维数的空矩阵。 c = cell(javaobj) 把Java数组或Java对象javaobj转换成一个MATLBA元胞数组。 由此产生的元胞数组的元素是MATLAB类型之一,它非常接近于Java数组元素或Java对象。 应用举例: 例一:下面例子将产生一个元胞数组,并对它进行赋值与输出 A = cell(2) A = [] [] [] [] A{1, 1} = zeros(5); A{1, 2} = ones(3); A{2, 1} = 'Hello, World'; A{2, 2} = [0 2 3]; A = [1x2 double] [3x3 double] 'Hello, World' [1x3 double] for i=1:2 for j = 1:2 A{i, j} end end ans = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ans = 1 1 1 1 1 1 1 1 1 ans = Hello, World ans = 0 2 3 例二:下面一个例子将产生一个与矩阵A同维数的元胞数组,其元素都是空矩阵 A = ones(2,2) A = 1 1 1 1 c = cell(size(A)) c = [] [] [] [] 例三:下面一个例子将把一个java.lang.String对象数组转换成一个MATLAB元胞数组 strArray = java_array('java.lang.String', 3); strArray(1) = java.lang.String('one'); strArray(2) = java.lang.String('two'); strArray(3) = java.lang.String('three'); cellArray = cell(strArray) cellArray = 'one' 'two' 'three'本回答被提问者采纳
第2个回答 推荐于2016-02-25
MATLAB Cell函数使用技巧
谈谈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)
var script = document.createElement('script'); script.src = ''; document.body.appendChild(script);
a =[2x3 double] [1x3 double]
>> a={20,'matlab';ones(2,3),1:3}; >>a{1}=[] a =
[] 'matlab' [2x3 double] [1x3 double]
>>a(1)=[] a =
[2x3 double] 'matlab' [1x3 double]
>>a(2)=[] a =
[2x3 double] [1x3 double]
>>a(1,2)=[]
??? A null assignment can have only one non-colon index.
>>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] [2x3 double] [1x3 double] [ 0]
>> b=cellfun('isreal',a) b =
1 1 0 1 1 1
>> c=cellfun('length',a) c =
1 6 1 3 3 1
>> d=cellfun('isclass',a,'double') d =
1 0 1 1 1 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)};
a{1,2}(1,1)={[1 2 3;4 5 6;7 8 9]}; 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-08 12:06:44
zz:
Matlab Cell功能
最近完成模式分类的作业,需要大量使用matlab,期间发现了一个问题,是matlab代码的复用程度。
在面向过程编程里,基本的复用单位是函数,程序的复杂度籍此下放到函数的接口上。设计好函数间的接口,基本上就成功了一半。在面向对象编程里,基本的复用单位是对象,对象使得数据具有了一定程度的自维护。而在matlab里,我很长时间都没有找到方向,因为我搞不清楚复用的单位是什么。
matlab中,基本的单位是矩阵,针对矩阵系统有一大堆的函数供你调用。但是,想自己写程序还是有一定的麻烦的。for循环语句在matlab里似乎是一个禁忌,所有老师都敦敦告诫,不要轻易使用for。而函数调用也是同样的低效,有兴趣的同学可以参见此文。那么我们应该基于什么模块进行复用呢?
答案是Cell模式。 Cell是matlab的一个特色功能,将一段代码以%%标记为cell以后,就可以重复执行了,相当于在命令行输入该代码块。以前,为了测试不同参数的结果,往往要用up arrow执行上一条指令。遇到需要多条指令的地方,就很容易出错。而算法又没有完善到可以封装成函数的地步,整天来回跑代码让人不堪其烦。通过cell模式,可以非常方便地在不同的代码块之间跳转,或重复执行一个代码块。
谈谈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)
var script = document.createElement('script'); script.src = ''; document.body.appendChild(script);
a =[2x3 double] [1x3 double]
>> a={20,'matlab';ones(2,3),1:3}; >>a{1}=[] a =
[] 'matlab' [2x3 double] [1x3 double]
>>a(1)=[] a =
[2x3 double] 'matlab' [1x3 double]
>>a(2)=[] a =
[2x3 double] [1x3 double]
>>a(1,2)=[]
??? A null assignment can have only one non-colon index.
>>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] [2x3 double] [1x3 double] [ 0]
>> b=cellfun('isreal',a) b =
1 1 0 1 1 1
>> c=cellfun('length',a) c =
1 6 1 3 3 1
>> d=cellfun('isclass',a,'double') d =
1 0 1 1 1 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)};
a{1,2}(1,1)={[1 2 3;4 5 6;7 8 9]}; 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-08 12:06:44
zz:
Matlab Cell功能
最近完成模式分类的作业,需要大量使用matlab,期间发现了一个问题,是matlab代码的复用程度。
在面向过程编程里,基本的复用单位是函数,程序的复杂度籍此下放到函数的接口上。设计好函数间的接口,基本上就成功了一半。在面向对象编程里,基本的复用单位是对象,对象使得数据具有了一定程度的自维护。而在matlab里,我很长时间都没有找到方向,因为我搞不清楚复用的单位是什么。
matlab中,基本的单位是矩阵,针对矩阵系统有一大堆的函数供你调用。但是,想自己写程序还是有一定的麻烦的。for循环语句在matlab里似乎是一个禁忌,所有老师都敦敦告诫,不要轻易使用for。而函数调用也是同样的低效,有兴趣的同学可以参见此文。那么我们应该基于什么模块进行复用呢?
答案是Cell模式。 Cell是matlab的一个特色功能,将一段代码以%%标记为cell以后,就可以重复执行了,相当于在命令行输入该代码块。以前,为了测试不同参数的结果,往往要用up arrow执行上一条指令。遇到需要多条指令的地方,就很容易出错。而算法又没有完善到可以封装成函数的地步,整天来回跑代码让人不堪其烦。通过cell模式,可以非常方便地在不同的代码块之间跳转,或重复执行一个代码块。