当前位置 博文首页 > 流浪若相惜的专栏:matlab 元胞调用方法你真的理解了么?

    流浪若相惜的专栏:matlab 元胞调用方法你真的理解了么?

    作者:[db:作者] 时间:2021-07-16 18:56

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

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

    r={1,{2,3}}
    r =
      1×2 cell 数组
        {[1]}    {1×2 cell}
    >> r{1}  %输出的是元胞内容
    ans =
         1
    >> r{2}
    ans =
      1×2 cell 数组 % 输出的是元胞数组,且每个元素都是元胞
        {[2]}    {[3]}
    >> r{2}(1)
    ans =
      1×1 cell 数组
        {[2]}
    >> s=r{2}(1)
    s =
      1×1 cell 数组  %仍旧是元胞对象 s是cell类型
        {[2]}
    >> m=r(1,2)
    m =
      1×1 cell 数组  %元胞对象
        {1×2 cell}
     >> n=r{2}{1}  %元胞内容 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>> r{1}
    ans =
      1×2 cell 数组  %第一个元胞元素中的内容
        {@objfun}    {@dee}
    K>> r{1}(1)
    ans =
      1×1 cell 数组 %第一个元胞中第一个元素对象
        {@objfun}
    

    当函数调用时仍旧同理:

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

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

    r=struct('initfun', {{@der,@dd,@rr}});
    uu=r.initfun{1}(1,2,3);  %调用der ,并假设三个函数均有有三个参数
    uu=r.initfun{3}(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).initfun{1}  %内容是@der
    

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

    r=struct('initfun', {{@der,@dd,@rr}});
    r.initfun{1}(1,2,3) % 调用
    
    cs
    下一篇:没有了