matlab 元胞調用方法你真的理解了麼?

元胞在引用時,{}和()到底有什麼區別?

注意:大括號用於表示元胞的內容,小括號表示指定的元胞對象。
舉例說明這句話的意思

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) % 調用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章