元胞在引用時,{}和()到底有什麼區別?
注意:大括號用於表示元胞的內容,小括號表示指定的元胞對象。
舉例說明這句話的意思
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) % 調用