关于MATLAB cell元胞数组中元素的引用问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于MATLAB cell元胞数组中元素的引用问题相关的知识,希望对你有一定的参考价值。

a1='aaa';

a2='bbb';

那么

a='aaa' 'bbb'

要引用元素

a(1)='aaa'

a1=aaa

请问a(1)和a1的区别是怎么回事,怎么一个有引号一个没有呢

Matlab的元胞数组是cell类型,可以有很多方法创建cell,对于你的要求,可以这样:
1c = 'beijing' 'capital of China' 'famous city'
定义方式(包括空格、逗号和分好的使用)跟普通数组一样,只是使用 。
当然也可以这样:
1234c = cell(1,3);c1,1 = 'beijing';c1,2 = 'capital of China';c1,3 = 'famous city';
cell的成员有两种引用方式:
c(1,1)返回的是cell类型,大小为1*1的cell
c1,1返回的是那个元素本身的类型,在上面的例子里就是字符串
参考技术A 一般的引用方式一般是用a ,看你的习惯了,也不是说a(1)不对,两个都对。
其实这两个输出有差别关键就在于,假如我们新建了一个cell(1,2),那么我们给他赋值的形式可以是:a1='aaa',也可以是a(1)='aaa' ,所以,你引用里面的元素的时候,自然也有对应的两种方式:a1 和a(1) ,我们可以看到: a1=aaa a(1)='aaa' ,其实这里面的aaa和'aaa'都是字符串。因为前面的a1里面已经有大括号了,所以后面就不用了再显示' '了,这也就间接的说明,的作用的 ''的作用其实是差不多的。只是一个作用在角标上,一个作用在真正的字符上。所以捏,显示有所差别。
给你个例子你就明白了:
num2str('ddddddd')
ans =
ddddddd
一个字符串在matlab已经知道他是字符串的情况下就会把''去掉。
但是致命的地方不是这里,你仔细在你的工作空间观察,你会发现,其实a(1)还是一个细胞,是一个结构,不能进行运算;而a1是一个真正的变量,真正能够进行数值运算!!
你能够算:a1+2 但是不能算a(1)+2 !!!!!!!追问

嗯,关于a()和a的区别知道了,一个是结构,一个是内容。另外,
num2str()是将数字转化为对应的字符串,num2str('ddddddd'),如果已经是字符串了,就不再转化了,直接显示,对吧?

追答

num2str()的功能是把数值转换成字符串,如果说matlab已经识别出是字符串了,当然就不用转换了。

本回答被提问者采纳
参考技术B 引用方式一般是用a 。在 matlab 中,所有的数组都可以用“(i)”来表示其中的第i个元素,元胞数组还可以用“i”,表示第i个cell内部。比如我们想定义一个元胞数组 a,并想给 a 的第一个元素赋值一个矩阵 [1 2 3],则有两种办法:
(1)直接给 a 的第一个元胞内部赋值一个矩阵 [1 2 3]:a1 = [1 2 3];(2)给 a 的第一个原素赋值一个元胞,元胞内部是矩阵 [1 2 3]:a(1) = [1 2 3][1 2 3] 表示矩阵 [1 2 3] 放在一个元胞内,然后在给数组 a 第一个元素,因为这是个数组,所以 a 是一个元胞数组。上面两种方式等价。

matlab 元胞调用方法你真的理解了么?

元胞在引用时,和()到底有什么区别?

注意:大括号用于表示元胞的内容,小括号表示指定的元胞对象。
举例说明这句话的意思

r=1,2,3
r =
  1×2 cell 数组
    [1]    1×2 cell
>> r1  %输出的是元胞内容
ans =
     1
>> r2
ans =
  1×2 cell 数组 % 输出的是元胞数组,且每个元素都是元胞
    [2]    [3]
>> r2(1)
ans =
  1×1 cell 数组
    [2]
>> s=r2(1)
s =
  1×1 cell 数组  %仍旧是元胞对象 s是cell类型
    [2]
>> m=r(1,2)
m =
  1×1 cell 数组  %元胞对象
    1×2 cell
 >> n=r21  %元胞内容 n是double类型
n =
     2
>> q=n*2
q =
     4
>> o=s*2
未定义与 'cell' 类型的输入参数相对应的运算符 '*'。 
>> 

当我们保存函数句柄的时候,调用函数时仍旧是***调用的函数内容,而非对象***:

 r=@objfun,@dee,@nsgaopt
r =
  1×2 cell 数组
    1×2 cell    1×1 cell
K>> r(1)
ans =
  1×1 cell 数组 % 表示@objfun,@dee这个元胞对象
    1×2 cell  %有两个要素
K>> r1
ans =
  1×2 cell 数组  %第一个元胞元素中的内容
    @objfun    @dee
K>> r1(1)
ans =
  1×1 cell 数组 %第一个元胞中第一个元素对象
    @objfun

当函数调用时仍旧同理:

>> r=@objfun,@dee,@nsgaopt
r =
  1×2 cell 数组
    1×2 cell    1×1 cell
>> r11
ans =
  包含以下值的 function_handle:
    @objfun
>> r1(1)
ans =
  1×1 cell 数组
    @objfun

但是如何函数有参数,怎么办呢?

r=struct('initfun', @der,@dd,@rr);
uu=r.initfun1(1,2,3);  %调用der ,并假设三个函数均有有三个参数
uu=r.initfun3(1,2,3);  %调用rr

% ② 
r=struct('initfun', @der,@dd,@rr); %错误写法
%③
r=struct('initfun', @der,@dd,@rr); %错误写法

后边两种写法为什么不对呢?
第二种写法的意思时initfun对应着一个元胞@der,@dd,@rr,但结构体中name和value是一一对应的,initfun对应了三个值,显然是不合理的;但是r是1*3的结构体数组,有三个值,每个值都是一个inifun的属性对象,选择其中的任一个与inifun对应就好了,因此可以写成

r(1).initfun(1,2,3)

但这样的写法是不是很怪,相当于initfun属性有三个对象,分别是r(1),r(2),r(3)

第三种写法同第二种方法,相当于@der,@dd和@rr是两个initfun对象,若调用则需写成

r(1).initfun1  %内容是@der

总结:第二种和第三种写法,相当于生成了多个属性对象,这与struct中name与value一一对应关系有点相悖,因此,不建议第二种和第三种写法。
推荐写法:

r=struct('initfun', @der,@dd,@rr);
r.initfun1(1,2,3) % 调用

以上是关于关于MATLAB cell元胞数组中元素的引用问题的主要内容,如果未能解决你的问题,请参考以下文章

Matlab中元胞数组与构架数组有啥不同?

Matlab怎么把元胞数组转化成矩阵

matlab中结构体和cell的区别

matlab元胞数组如何提取里面的具体元素?

matlab 元胞调用方法你真的理解了么?

matlab中cell数组用法