【Matlab 】【轉】元胞數組--cell


 

 

 

 

元胞數組:

    元胞數組是MATLAB的一種特殊數據類型,可以將元胞數組看做一種無所不包的通用矩陣,或者叫做廣義矩陣。組成元胞數組的元素可以是任何一種數據類型的常數或者常量,每一個元素也可以具有不同的尺寸和內存占用空間,每一個元素的內容也可以完全不同,所以元胞數組的元素叫做元胞(cell)。和一般的數值矩陣一樣,元胞數組的內存空間也是動態分配的。

     (1)元胞數組的創建

    

>> a={'matlab',20;ones(2,3),1:10}

a =

    'matlab'        [         20]
    [2x3 double]    [1x10 double]

>> b=[{'matlab'},{20};{ones(2,3)},{1:10}]

b =

    'matlab'        [         20]
    [2x3 double]    [1x10 double]

>> c={10}

c =

    [10]

>> c(1,2)={2}

c =

    [10]    [2]

>> c(2,2)={5}

c =

    [10]    [2]
      []    [5]

>> isequal(a,b)

ans =

     1

>> whos
Name      Size            Bytes Class      Attributes

a         2x2               388 cell                 
ans       1x1                 1 logical              
b         2x2               388 cell                 
c         2x2               208 cell   

用cell函數創建元胞數組,創建的數組為空元胞。cell函數創建空元胞數組的主要目的是為數組預先分配連續的存儲空間,節約內存占用,提高執行效率。    

>> a=cell(1)

a =

    {[]}

>> b=cell(1,2)

b =

     []     []

>> c=cell(3,3)

c =

     []     []     []
     []     []     []
     []     []     []

>> d=cell(2,2,2)

d(:,:,1) =

     []     []
     []     []


d(:,:,2) =

     []     []
     []     []

>> whos
Name      Size             Bytes Class      Attributes

a         1x1                  4 cell                 
ans       1x1                  1 logical              
b         1x2                  8 cell                 
c         3x3                 36 cell                 
d         2x2x2               32 cell   

   (2)元胞數組的數據獲得

    從元胞數組中讀取數據,可保存為一個標准的數組或一個新的單元數組,或取出數組進行計算。元胞數組中數據的訪問,可通過元胞內容的下標進行,用元胞數組名加大括號{}。大括號中數值表示元胞的下標。如a{1,2}表示元胞數組中第一行第二列的元胞。


>> a={20,'matlab';ones(2,3),1:3}

a =

    [        20]    'matlab'    
    [2x3 double]    [1x3 double]

>> str=a(1,2)

str =

    'matlab'

>> class(str)

ans =

cell

>> str=a{1,2}

str =

matlab

>> class(str)

ans =

char

()和{}有着本質的區別,大括號用於表示元胞的內容,小括號表示指定的元胞。


a =

    [        20]    'matlab'    
    [2x3 double]    [1x3 double]

>> a{2,1}(2,2)

ans =

    0.9134

>> a{2,1}(2,3)

ans =

    0.0975

>> a{1,2}(2)

ans =

a

使用元胞的下標,可將一個元胞數組的子集賦值給另一個變量,創建新的元胞數組。

>> a=[{1},{2},{3};{4},{5},{6};{7},{8},{9}]

a =

    [1]    [2]    [3]
    [4]    [5]    [6]
    [7]    [8]    [9]

>> b=a(2:3,2:3)

b =

    [5]    [6]
    [8]    [9]

>> c=a(1:3,2:3)

c =

    [2]    [3]
    [5]    [6]
    [8]    [9]

     本例使用元胞下標的方式創建了新的元胞數組b和c,通過結果看出b和c就是元胞數組a的一部分。

     (3)元胞數組的刪除和重塑

     要刪除單元數組中的行或列,可以用冒號表示單元數組中的行或列,然后對其賦一個空矩陣即可。

    

a={20,'matlab';ones(2,3),1:3}

a =

    [        20]    'matlab'    
    [2x3 double]    [1x3 double]

>> a(1,:)=[]

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)元胞數組與數值數組間的轉化

      應用循環,可以將元胞數組轉化為數值數組。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM