2012-12-29 50 views
1

我有兩個變量與我完全一樣,但一個是<double>,另一個是<cell>。在代碼中,它們似乎被cell2mat轉換。我知道這是一個數據存儲問題,但我只是沒有看到celldouble的區別和定義。存儲在單元格中的數據與在MATLAB中存儲爲double的數據之間有什麼區別?

+0

雖然答案很好 - 我想指出,在數組中,所有條目必須是相同的類型 - 而在單元格中,它們可以是不同的類型(像Excel表格一樣思考 - 數字和文本混合)。 – bdecaf

回答

4

數組和陣列數組可能是MATLAB中最常用的兩種數據類型。

一維和二維數組就像線性代數中的數學一樣是矩陣。但是數組也可以是多維(n維)數組,也稱爲張量,MATLAB稱它們爲多維數組。此外,MATLAB不會在標量和數組之間進行區分,也不會在矢量和其他矩陣之間進行區分。標量只是MATLAB中的1x1數組,在MATLAB中矢量是Nx1和1xN數組。

一些例子:

MyScalar = 1; 
MyHorizVector = [ 1 2 3 ]; 
MyVertVector = [ 1 2 3 ]'; 
MyMatrix = [ 1, 2; 3, 4 ]; 
My4Darray = cat(4, [ 1 2; 3 4], [ 5 6; 7 8 ], [ 9 10; 11 12 ], [ 13 14; 15 16 ]); 

class(MyScalar) 
ans = 
    double 

class(MyHorizVector) 
ans = 
    double 

class(MyVertVector) 
ans = 
    double 

class(MyMatrix) 
ans = 
    double 

class(My4Darray) 
ans = 
    double 

所以,類中的所有這些5個不同的陣列的是double,如通過class命令報告。 double表示使用的數字精度(雙精度)。

單元格數組是一個更抽象的概念。單元格數組可以包含一個或多個數組,它也可以包含其他類型的非數組變量。單元陣列也可以容納其他單元陣列,它們可以再次保持單元陣列可容納的任何單元陣列。所以,單元陣列也可以相互遞歸地存儲。

單元格數組可用於將不同的對象組合成單個變量,例如,被傳遞給一個函數或者與cellfun一起處理。每個單元格數組由1個或多個單元格組成。任何陣列都可以使用{}運算符轉換爲單元陣列,結果是1x1單元陣列。還有mat2cellnum2cell命令可用。

MyCellArrayContainingMyScalar = { MyScalar }; 
MyCellArrayContainingMyHorizVector = { MyHorizVector }; 
MyCellArrayContainingMyCellArrayContainingMyScalar = { MyCellArrayContainingMyScalar }; 

上面創建的所有單元格數組都是1x1單元格數組。

class(MyCellArrayContainingMyScalar) 
ans = 
    cell 

class(MyCellArrayContainingMyHorizVector) 
ans = 
    cell 

class(MyCellArrayContainingMyCellArrayContainingMyScalar) 
ans = 
    cell 

但不是所有的單元陣列可以被轉換成使用cell2mat基質,因爲單個單元陣列可以認爲無法在同一陣列中存在多個不同的數據類型。

這些做的工作:

cell2mat(MyCellArrayContainingMyScalar) 
ans = 
    1 

cell2mat(MyCellArrayContainingMyHorizVector) 
ans = 
    1  2  3 

但這種失敗:

cell2mat(MyCellArrayContainingMyCellArrayContainingMyScalar); 

Error using cell2mat (line 53) 
Cannot support cell arrays containing cell arrays or objects. 

但是,讓我們嘗試不同類型的由不同陣列的單元陣列的:

MyCellArray{1} = [ 1 2 3 ]; 
MyCellArray{2} = 'This is the 2nd cell of MyCellArray!'; 

class(MyCellArray) 
ans = 
    cell 

這種細胞數組都不能通過使用cell2mat轉換爲數組:

cell2mat(MyCellArray) 

Error using cell2mat (line 46) 
All contents of the input cell array must be of the same data type. 

希望這有助於得到一個想法。

+0

+1:很好的解釋:) –

5

添加到nrz的答案,值得注意的是,存儲單元陣列時還有額外的內存開銷。例如,考慮下面的代碼:

A = 1:5 
B = {A} 
C = num2cell(A) 
whos 

產生以下輸出:

A = 
    1  2  3  4  5 


B =  
    [1x5 double] 


C = 
    [1] [2] [3] [4] [5] 

    Name  Size   Bytes Class  Attributes  
    A   1x5    40 double    
    B   1x1    152 cell     
    C   1x5    600 cell     
  • 正如你可以從第一行看到,雙打的基本1×5矢量A在內存中需要40個字節(每個雙字節需要8個字節)。
  • 第二行顯示只包裝A與一個單元產生B增加額外的112個字節。這是MATLAB中單個單元的開銷。
  • 第三行確認,因爲C包含5個單元並且需要(112 + 8)×5 = 600個字節。
+0

我對此很困惑。我認爲矩陣需要一些關於它們幾何的信息。但是我得到和你一樣的結果。 – bdecaf

+0

@bdecaf信息可能與變量名一起存儲在某處,這也不包括在這裏:-) –

相關問題