2012-10-21 68 views

回答

28

有一個單元陣列和在MATLAB矩陣之間的若干不同之處:

  • 甲單元陣列可以包含在每個電池元件的任意類型;而矩陣要求其元素的類型是均勻的,即相同類型。就內存佈局而言,矩陣的所有元素都連續地放在內存中,而單元數組包含指向數組中每個元素的指針。當考慮像高性能代碼的緩存局部性時,這可能很重要。

  • 點2的另一面是,當您調整矩陣大小時,矩陣中的每個元素都必須複製到新分配的內存區域,但在單元陣列的情況下,只需要複製一列指針。根據要存儲的元素的大小和類型,這可能意味着單元陣列調整速度要快得多。


爲了說明在內存佈局的區別,讓我們考慮一個簡單的例子:

A = [10 20 30 40]; 

這裏MATLAB創建了一個名爲新的矩陣變量,分配足夠的內存來容納4個雙打(32字節,假設8字節加倍)並且將該存儲器分配給指向A的真實部分的指針。(如果創建複數的矩陣,則也爲想象的部分分配存儲器,和一個單獨的指針指向這個內存區域)。

現在讓我們創建包含這些元素的單元陣列:

B = cell(1, 4); 
B{1,1} = 10; 
B{1,2} = 20; 
B{1,3} = 30; 
B{1,4} = 40; 

當MATLAB執行的第一條語句,它創建一個包含4個指針,其中的每一個可以指向任意類型的單元陣列。所以B已經在使用16個字節(假設32位指針)。 下一行創建一個包含值10的1x1矩陣,並將其分配給第一個單元格數組元素。這裏的過程類似於上面描述的創建1x4矩陣的過程,除了分配的內存只足夠容納一個雙字節(8字節)。對於其餘3個陳述中的每一個都重複了這一點。因此,至少在第二個示例中使用16 + 8 x 4 = 48字節。

請注意,MATLAB中的每個變量還包含稱爲mxArray的結構的內存開銷,該結構存儲維度,數據類型等信息以及更多關於該變量的信息。爲了簡單起見,我忽略了這種開銷。

+1

一對夫婦......這是一個有點過於具體的說像B這樣的單元陣列本身就是存儲指針。從概念上講,單元格就像指針一樣,但是Matlab沒有記錄它們是如何在'mxArray'內部實現的。我們只知道它在那裏存儲了一些開銷。 Matlab會告訴你有多少開銷:做'a = []; c = {a}; whos',Matlab將報告c使用的一些字節。我認爲這是每個mxarray有多少開銷。 –

+1

...事實上,它以這種方式報告,並結合查看調試器中的地址和MAT文件格式等,向我暗示,單元mxArrays可能實際上是直接存儲mxArray結構的C數組(即它),而不是指針。 –

+0

此外,我知道這是nitpicky,但它是Matlab中每個原始或複合數組* value *有一個mxArray,而不是每個變量。 B是一個變量。它包含一個4長單元格數組,每個單元格元素包含一個雙數組。所以B的數據結構中有5個mxArrays。這就是爲什麼單元格和結構體可能會使用很多開銷,可以使用'whos'建議的每個mxarray開銷來近似。 –