matlab學習筆記12單元數組和元胞數組 cell,celldisp,iscell,isa,deal,cellfun,num2cell,size

一塊兒來學matlab-matlab學習筆記12

12_1 單元數組和元胞數組

cell array --cell,celldisp,iscell,isa,deal,cellfun,num2cell,size

以爲有用的話,歡迎一塊兒討論相互學習~Follow Me

  • 單元數組(cellarray)和結構體(structure)均可以將不一樣類型的相關數據集成到一個單一的變量中,使得大量的相關數據的處理變得很是簡單並且方便。可是,須要注意的是,單元數組和結構體只是承載其餘數據類型的容器,大部分的數學運算則只是針對二者之中具體的數據進行,而不是針對單元數組或結構體自己而進行。
  • 單元數組中的每個單元是經過一個數字來進行索引的,但用戶須要加人一個單元中或者從一個單元中提取數據時,須要給出單元數組中該單元的索引。結構體和單元數組十分類似,二者之間的主要區別在於,結構體中的數據存儲並非由數字來表示的,而是經過結構體中的名稱來進行表示的。git

    單元數組的建立和操做

  • 單元數組中的每個元素稱爲單元(cell)。單元中的數據能夠爲任何數據類型,包括數值數組、字符、符號對象、其餘單元數組或結構體等。不一樣的單元中的數據類型能夠不一樣。理論上,單元數組能夠建立任意維數的單元數組,大多數狀況下,爲簡單起見,建立簡單的單元數組(如一維單元數組)。單元數組的建立方法能夠分爲兩種,經過賦值語句直接建立;或經過cell函數首先爲單元數組分配內存空間,而後再對每一個單元進行賦值。若是在工做空間內的某個變量名與所建立的單元數組同名,那麼此時則不會對單元數組賦值
  • 直接經過賦值語句建立單元數組時,能夠採用兩種方法來進行,即按 單元索引法 和按 內容索引法(其實也就是將花括號放在等式的右邊或是左邊的區別)。按 單元索引法 賦值時,採用標準數組的賦值方法,賦值時賦給單元的數值經過花括號 ({}) 將單元內容括起來。按 內容索引法 賦值時,將花括號寫在等號左邊,即放在單元數組名稱後。
    在這裏插入圖片描述
  • 注意."按單元索引法"和"按內容索引法"是徹底等效的,能夠互換使用。經過上面的實例,咱們看到:花括號"{}"用於訪問單元的值,而括號"()"用於標識單元(即:不用於訪問單元的值)。具體理解"{}"和"()"區別能夠在下面代碼最後分別輸入A{2,2}和A(2,2)。就會發現."按內容索引法{}"能顯示完整的單元內容,而"按單元索引法()"有時沒法顯示完整的單元內容。若是須要將單元數組的全部內容都顯示出來,則能夠採用celldisp函數來強制顯示單元數組的全部內容。
    在這裏插入圖片描述
  • 單元數組建立的另外一種方法是經過cell函數進行建立的。在建立時,能夠採用cell函數生成空的單元數組,爲單元數組分配內存,而後再想單元數組內存儲內容。存儲數據時,能夠採用 內容賦值法 或採用 單元索引法 來進行
    在這裏插入圖片描述
  • 單元數組還能夠經過擴展的方法來獲得進一步的擴展。如利用方括號將多個單元數組組合在一塊兒,從而造成維數更高的單元數組。若是想要得到單元數組子單元的內容,則能夠利用數組索引的方法,將一個數組的子集提取出賦予新的單元數組。刪除單元數組中的某一部份內容,能夠將這部份內容設置爲空數組,便可刪除單元數組中的這部份內容github

    高維數組取值區別

  • 對於其餘語言來講,每每使用多個方括號的形式[][],來對高維數組中的元素進行取值,可是在matlab中使用","分隔維度.例如A(3,1)表示取A數組中第三行第一個元素,A(3,:)表示取第三行全部列的元素,A([1,2],:)表示取第一行和第二行全部列中的元素
  • 對於元胞數組的拼接使用的是"[]"方括號,而不是"{}或者是()",可是使用數組的數組和搜索使用"{}"比"()"更好, 例如a(1,1)返回的是1行1列元素的數據類型,a{1,1}返回的是1行1列中的元素內容數組

clear A      %按單元索引法賦值
A(1,1)={[1 2 3;4 5 6; 7 8 9]};
A(1,2)={1+2i};
A(2,1)={'hello world'};
A(2,2)={0:pi/3:pi};
clear B      %按內容索引法賦值
B{1,1}=[1 2 3;4 5 6;7 8 9];
B{1,2}=3+4i;
B{2,1}='hello world';
B{2,2}=0:2:9;
% 使用B(2,:)能夠提取B cell array中第二行中全部的元素,:表示取全部的列
C=[A;B] % 將A元胞數組中的全部元素和B元胞數組中的全部元素相拼接
sprintf('C(i)表示遍歷C數組中的全部個體元素')
for i =1:8
    C{i}
end
sprintf('C(3,1)')
sprintf('%f',C{3,1}) % 表示取第三行的第一個元素
sprintf('C(i,:)表示遍歷C數組中的全部行元素')
for i=1:4
    C{i,:}
end
% sprintf('C(3,1) %f',C(3,1)) % 表示取第三行的第一個元素 這是一種錯誤的寫法,這種寫法會報錯誤

C =
     [3x3 double]    [1.0000 + 2.0000i]
    'hello world'          [1x4 double]
     [3x3 double]    [3.0000 + 4.0000i]
    'hello world'          [1x5 double]
ans =
C(i)表示遍歷C數組中的全部個體元素
ans =
     1     2     3
     4     5     6
     7     8     9
ans =
hello world
ans =
     1     2     3
     4     5     6
     7     8     9
ans =
hello world
ans =
   1.0000 + 2.0000i
ans =
         0    1.0472    2.0944    3.1416
ans =
   3.0000 + 4.0000i
ans =
     0     2     4     6     8
ans =
C(3,1)
ans =
1.0000004.0000007.0000002.0000005.0000008.0000003.0000006.0000009.000000
ans =
C(i,:)表示遍歷C數組中的全部行元素
ans =
     1     2     3
     4     5     6
     7     8     9
ans =
   1.0000 + 2.0000i
ans =
hello world
ans =
         0    1.0472    2.0944    3.1416
ans =
     1     2     3
     4     5     6
     7     8     9
ans =
   3.0000 + 4.0000i
ans =
hello world
ans =
     0     2     4     6     8
  • 在單元數組的操做中,能夠利用reshape函數來改變單元數組的結構。通過reshape函數對單元數組進行處理後,單元數組的內容並不會增長或減小,且單元數組改變先後的單元總數目並不發生變化。函數

    使用repmat函數複製單元數組

format compact
A1=cell(1)
A2=cell(2)
A3=cell(3) % 默認初始化爲方陣
A=cell(2,3)
size(A)%計算單元數組A的大小
B=reshape(A,3,2)%改變結構後的單元數組
C1=repmat(B,1,2)
C2=repmat(B,3,2)

A1 =
    {[]}
A2 =
    []    []
    []    []
A3 =
    []    []    []
    []    []    []
    []    []    []
A =
    []    []    []
    []    []    []
ans =
     2     3
B =
    []    []
    []    []
    []    []
C1 =
    []    []    []    []
    []    []    []    []
    []    []    []    []
C2 =
    []    []    []    []
    []    []    []    []
    []    []    []    []
    []    []    []    []
    []    []    []    []
    []    []    []    []
    []    []    []    []
    []    []    []    []
    []    []    []    []

單元數組函數

  • MATLAB提供了單元數組的處理函數學習

    cell--新建元胞數組

    celldisp--顯示單元數組的全部單元內容

a=ones(3,4);
b=zeros(3,2);
c=(5:6)';
X={a b c}
celldisp(X)

X =
    [3x4 double]    [3x2 double]    [2x1 double]
X{1} =
     1     1     1     1
     1     1     1     1
     1     1     1     1
X{2} =
     0     0
     0     0
     0     0
X{3} =
     5
     6

iscell--判斷是否爲元胞數組

a=ones(3,4);
b=zeros(3,2);
c=(5:6)';
X={a b c};
% celldisp(X);
iscell(a)
iscell(X)


ans =
     0
ans =
     1

isa--肯定變量是否具備指定的數據類型

A = 3.1416;
tf1 = isa(A,'double')
tf2 = isa(A,'int')

tf1 =
     1
tf2 =
     0

cellfun--將一個指定的函數應用到一個單元數組的全部單元

  • 對元胞數組中的每一個元胞應用數組3d

    語法

    A = cellfun(func,C)
    A = cellfun(func,C1,...,Cn)
    A = cellfun( ___ ,Name,Value )
    [ A1,...,Am ] = cellfun( ___ )code

    說明

  • A = cellfun(func,C) 將函數 func 應用於元胞數組 C 的每一個元胞的內容,每次應用於一個元胞。而後 cellfun 將 func 的輸出串聯成輸出數組 A,所以,對於 C 的第 i 個元素來講,A(i) = func(C{i})。輸入參數 func 是一個函數的函數句柄,此函數接受一個輸入參數並返回一個標量。func 的輸出能夠是任何數據類型,只要該類型的對象能夠串聯便可。數組 A 和元胞數組 C 具備相同的大小。orm

您不能指定 cellfun 計算 A 的各元素的順序,也不能期望它們按任何特定的順序完成計算。對象

  • A = cellfun(func,C1,...,Cn) 將 func 應用於 C1,...,Cn 的各元胞的內容,所以 A(i) = func(C1{i},...,Cn{i})。函數 func 必須接受 n 個輸入參數並返回一個標量。元胞數組 C1,...,Cn 的大小必須所有相同blog

  • A = cellfun ( ___ ,Name,Value ) 應用 func 並使用一個或多個 Name,Value 對組參數指定其餘選項。例如,要以元胞數組形式返回輸出值,請指定 'UniformOutput',false。當 func 返回的值不能串聯成數組時,能夠按元胞數組的形式返回 A。您能夠將 Name,Value 對組參數與上述任何語法中的輸入參數結合使用。

  • 當 func 返回 m 個輸出值時,[A1,...,Am] = cellfun( ___ ) 返回多個輸出數組 A1,...,Am。func 能夠返回不一樣數據類型的輸出參數,但每次調用 func 時返回的每一個輸出的數據類型必須相同。您能夠將此語法與前面語法中的任何輸入參數結合使用。從 func 返回的輸出參數的數量沒必要與 C1,...,Cn 指定的輸入參數的數量相同。

    將函數應用於元胞數組的內容

建立一個元胞數組,其中包含不一樣大小的數值數組。

C = {1:10, [2; 4; 6], []}
C = 1x3 cell array
    {1x10 double}    {3x1 double}    {0x0 double}

計算每一個數值數組的均值,而後以數組的形式返回這些均值。

A = cellfun(@mean,C)
A = 1×3

    5.5000    4.0000       NaN

將函數應用於元胞數組的內容

建立兩個元胞數組,其中包含不一樣大小的數值數組。

X = {5:5:100, 10:10:100, 20:20:100};
Y = {rand(1,20), rand(1,10), rand(1,5)};
繪製數組。從 plot 函數返回圖形線條對象數組,並使用這些對象爲每一組數據點添加不一樣的標記。cellfun 能夠返回任何數據類型的數組,只要該數據類型的對象能夠串聯便可。

figure
hold on
p = cellfun(@plot,X,Y);
p(1).Marker = 'o';
p(2).Marker = '+';
p(3).Marker = 's';
hold off

在這裏插入圖片描述

返回多個輸出數組

建立一個元胞數組,其中包含不一樣大小的數值數組。

C = {1:10, [2; 4; 6], []}
C = 1x3 cell array
    {1x10 double}    {3x1 double}    {0x0 double}

計算 C 中每一個數組的大小。行數和列數分別輸出在兩個 1×3 數值數組中。

[nrows,ncols] = cellfun(@size,C)
nrows = 1×3

     1     3     0

ncols = 1×3

    10     1     0

將函數應用於元胞數組或字符串數組中的字符

  • 您可使用 cellfun 將函數應用於字符向量元胞數組和字符串數組。cellfun 以相同的方式處理這兩種數組。
    建立一個字符向量元胞數組,其中包含一週各個工做日的名稱。
C = {'Monday','Tuesday','Wednesday','Thursday','Friday'}
C = 1x5 cell array
    {'Monday'}    {'Tuesday'}    {'Wednesday'}    {'Thursday'}    {'Friday'}

使用 cellfun 函數爲這些名稱建立三個字母的縮寫。指定一個函數,以提取前三個字符並將它們以字符向量的形式返回。要以元胞數組的形式返回這些縮寫,請指定 'UniformOutput',false 名稱-值對組。

A = cellfun(@(x) x(1:3),C,'UniformOutput',false)
A = 1x5 cell array
    {'Mon'}    {'Tue'}    {'Wed'}    {'Thu'}    {'Fri'}

爲了實現兼容性,cellfun 將字符串數組的每一個元素視爲一個字符向量。若是您指定返回文本的函數,cellfun 將以字符向量元胞數組而不是字符串數組的形式返回文本。  " 'UniformOutput',false "

使用 cellfun 爲字符串數組中的名稱建立縮寫。

str = ["Saturday","Sunday"]
str = 1x2 string array
    "Saturday"    "Sunday"

B = cellfun(@(x) x(1:3),str,'UniformOutput',false)
B = 1x2 cell array
    {'Sat'}    {'Sun'}

size--獲取數組的維度大小數值

num2cell--從一個數組中提取指定元素,填充到單元數組

  • 將數組轉換爲相同大小的元胞數組

    語法

    C = num2cell(A)
    C = num2cell(A,dim)

    說明

  • C = num2cell(A) 經過將 A 的每一個元素放置於 C 的一個單獨元胞中,來將數組 A 轉換爲元胞數組 C。num2cell 函數轉換具備任意數據類型(甚至是非數值類型)的數組。
  • C = num2cell(A,dim) 將 A 的內容劃分紅 C 中單獨的元胞,其中 dim 指定每一個元胞包含 A 的哪一個維度。dim 能夠是維度的標量或向量。例如,若是 A 有 2 行 3 列,那麼:
    • num2cell(A,1) 建立一個 1×3 元胞數組 C,其中每一個元胞包含 A 的 2×1 列。 即按列劃分
    • num2cell(A,2) 建立一個 2×1 元胞數組 C,其中每一個元胞包含 A 的 1×3 行。 即按行劃分
    • num2cell(A,[1 2]) 建立一個 1×1 元胞數組 C,其中每一個元胞包含 A 整個數組。

將數組轉換爲元胞數組

將一個數值數組的全部元素放入單獨的元胞。

  a = magic(3)
  a = 3×3

       8     1     6
       3     5     7
       4     9     2

  c = num2cell(a)
  c = 3x3 cell array
      {[8]}    {[1]}    {[6]}
      {[3]}    {[5]}    {[7]}
      {[4]}    {[9]}    {[2]}

  將一個單詞的各個字母放入數組的各個元胞中。

  a = ['four';'five';'nine']
  a = 3x4 char array
      'four'
      'five'
      'nine'

  c = num2cell(a)
  c = 3x4 cell array
      {'f'}    {'o'}    {'u'}    {'r'}
      {'f'}    {'i'}    {'v'}    {'e'}
      {'n'}    {'i'}    {'n'}    {'e'}

建立數值數組的元胞數組

  • 生成一個 4×3×2 的數值數組,而後建立一個包含 4×1 列向量的 1×3×2 的元胞數組。
A = reshape(1:12,4,3);
A(:,:,2) = A*10
A =
A(:,:,1) =

     1     5     9
     2     6    10
     3     7    11
     4     8    12


A(:,:,2) =

    10    50    90
    20    60   100
    30    70   110
    40    80   120
  • 按列劃分
C = num2cell(A,1)
C = 1x3x2 cell array
C(:,:,1) =

    {4x1 double}    {4x1 double}    {4x1 double}


C(:,:,2) =

    {4x1 double}    {4x1 double}    {4x1 double}

每一個 4×1 向量包含沿 A 的第一維度的元素:

C{1}
ans = 4×1

     1
     2
     3
     4
  • 按行劃分
建立 1×3 數值數組的 4×1×2 元胞數組。

C = num2cell(A,2)
C = 4x1x2 cell array
C(:,:,1) =

    {1x3 double}
    {1x3 double}
    {1x3 double}
    {1x3 double}


C(:,:,2) =

    {1x3 double}
    {1x3 double}
    {1x3 double}
    {1x3 double}

每一個 1×3 行向量包含沿 A 的第二維度的元素:

C{1}
ans = 1×3

     1     5     9
  • 按第三個維度進行劃分
建立 1×1×2 數值數組的 4×3 元胞數組。

C = num2cell(A,3)
C = 4x3 cell array
    {1x1x2 double}    {1x1x2 double}    {1x1x2 double}
    {1x1x2 double}    {1x1x2 double}    {1x1x2 double}
    {1x1x2 double}    {1x1x2 double}    {1x1x2 double}
    {1x1x2 double}    {1x1x2 double}    {1x1x2 double}

每一個 1×1×2 向量包含沿 A 的第三維度的元素:

C{1}
ans =
ans(:,:,1) =

     1


ans(:,:,2) =

    10

合併維度

  • 經過合併各個維度的數值數組建立一個元胞數組
A = reshape(1:12,4,3);
A(:,:,2) = A*10
A =
A(:,:,1) =

     1     5     9
     2     6    10
     3     7    11
     4     8    12


A(:,:,2) =

    10    50    90
    20    60   100
    30    70   110
    40    80   120

c = num2cell(A,[1 3])
c = 1x3 cell array
    {4x1x2 double}    {4x1x2 double}    {4x1x2 double}

每一個 4×1×2 數組包含沿 A 的第一維度和第三維度的元素:

c{1}
ans =
ans(:,:,1) =

     1
     2
     3
     4


ans(:,:,2) =

    10
    20
    30
    40

c = num2cell(A,[2 3])
c = 4x1 cell array
    {1x3x2 double}
    {1x3x2 double}
    {1x3x2 double}
    {1x3x2 double}
相關文章
相關標籤/搜索