我有兩個變量與我完全一樣,但一個是<double>
,另一個是<cell>
。在代碼中,它們似乎被cell2mat
轉換。我知道這是一個數據存儲問題,但我只是沒有看到cell
和double
的區別和定義。存儲在單元格中的數據與在MATLAB中存儲爲double的數據之間有什麼區別?
回答
數組和陣列數組可能是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單元陣列。還有mat2cell
和num2cell
命令可用。
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.
希望這有助於得到一個想法。
+1:很好的解釋:) –
添加到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個字節。
我對此很困惑。我認爲矩陣需要一些關於它們幾何的信息。但是我得到和你一樣的結果。 – bdecaf
@bdecaf信息可能與變量名一起存儲在某處,這也不包括在這裏:-) –
- 1. 將數據存儲在blob中與將指針存儲到文件之間有什麼區別?
- 2. 數據存儲和託管存儲之間的區別?
- 3. dropbox,插入和數據存儲之間的區別是什麼
- 4. 數據存儲類別與字符串:有什麼區別?
- 5. App Engine數據存儲中的key_id和key_name之間的區別是什麼?
- 6. MySQL主數據存儲區和MongoDB輔助數據存儲區之間的ETL
- 7. HTML5 =元數據與微數據之間有什麼區別?
- 8. 在plist中存儲數據與在Sprite Kit中設置場景編輯器中的數據有什麼區別?
- 9. 爲什麼數據不會存儲在我的數據庫中?
- 10. 在數據存儲中存儲元組的有效方法
- 11. 爲什麼存儲在內存中的數據顛倒了?
- 12. 無法在Mysql5.6中存儲空間數據類型的double值
- 13. 用於在數據庫中存儲EXIF元數據的格式
- 14. 是什麼進口DB和進口數據存儲之間的區別
- 15. 類型和類之間的數據存儲區別
- 16. 輸入數據未存儲在數據庫中 - 爲什麼?
- 17. 爲什麼Jenkins沒有存儲數據?
- 18. 在數據存儲區中作爲Blob存儲在html頁面中的圖像
- 19. 爲什麼mysql在「#」字符之後沒有存儲數據?
- 20. 存儲常量數據:python模塊與數據存儲區
- 21. Spark shuffle爲什麼在磁盤上存儲中間數據?
- 22. 對象存儲和鍵值數據庫有什麼區別?
- 23. 數據存儲單元
- 24. 將數據存儲在會話或httpcontext對象中有什麼區別
- 25. 在動作之間存儲數據
- 26. 爲什麼存儲在寄存器中的數據有內存地址?
- 27. 將數據存儲區遊標存儲在memcache或數據存儲區中的位置?
- 28. mongodb中存儲數組和新數組之間的區別
- 29. 在數據庫中存儲時區
- 30. 從matlab中的循環存儲數據
雖然答案很好 - 我想指出,在數組中,所有條目必須是相同的類型 - 而在單元格中,它們可以是不同的類型(像Excel表格一樣思考 - 數字和文本混合)。 – bdecaf