單元數組中的每個單元是經過一個數字來進行索引的,但用戶須要加人一個單元中或者從一個單元中提取數據時,須要給出單元數組中該單元的索引。結構體和單元數組十分類似,二者之間的主要區別在於,結構體中的數據存儲並非由數字來表示的,而是經過結構體中的名稱來進行表示的。git
單元數組還能夠經過擴展的方法來獲得進一步的擴展。如利用方括號將多個單元數組組合在一塊兒,從而造成維數更高的單元數組。若是想要得到單元數組子單元的內容,則能夠利用數組索引的方法,將一個數組的子集提取出賦予新的單元數組。刪除單元數組中的某一部份內容,能夠將這部份內容設置爲空數組,便可刪除單元數組中的這部份內容github
對於元胞數組的拼接使用的是"[]"方括號,而不是"{}或者是()",可是使用數組的數組和搜索使用"{}"比"()"更好, 例如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函數對單元數組進行處理後,單元數組的內容並不會增長或減小,且單元數組改變先後的單元總數目並不發生變化。函數
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提供了單元數組的處理函數學習
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
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
A = 3.1416; tf1 = isa(A,'double') tf2 = isa(A,'int') tf1 = 1 tf2 = 0
對元胞數組中的每一個元胞應用數組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
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'}
將數組轉換爲相同大小的元胞數組
C = num2cell(A)
C = num2cell(A,dim)
將一個數值數組的全部元素放入單獨的元胞。 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'}
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}