2015-10-04 40 views
4

我最近發現了以前沒有發生的MATLAB單元陣列的奇怪行爲。matlab單元陣列尺寸比實際數據大得多

如果我創建與

a=cell(1,4) 

其大小的單元陣列是32個字節。

如果我在裏面放了東西,例如

a{2}='abcd' 

其大小變爲144字節。但是,如果我通過把

a{2}=[] 

刪除該內容的大小會變爲132個字節等。問題是什麼?

+0

答案很有趣,但我認爲它不能解釋在這種情況下發生了什麼。當我顯示將單元格保存到mat文件時創建的文件大小時,我發現了這個問題。一個月前,這些文件的大小約爲20K。現在使用相似數量的數據(以及相同的程序),其大小超過100 Mb。在中間我從Windows 8升級到Windoes 10.問題可以在那裏嗎?如果有,有解決方案嗎?謝謝 –

回答

7

簡而言之,Matlab單元陣列需要一些內部數據結構來跟蹤存儲的內容。

看起來,Matlab根據需要分配內存,從而在插入數據時擴展單元陣列所需的存儲空間。

刪除數據並不意味着matlab可以將現在未使用的內存返回到操作系統或內部內存池 - 這可能是內部存儲結構不可能實現的東西,或者是不明智的東西就性能而言,因爲從其中刪除數據的單元陣列(對所有單元陣列的使用情況而言)是經常更新的結構,所以「過早地」返回內存僅僅是爲了在稍後幾條指令後重新獲取內存將是很酷的CPU。

作爲一般說明:對於幾乎所有的矩陣和稀疏矩陣(向量當然是矩陣的特殊情況),Matlab都有非常糟糕的存儲方法。那是因爲Matlab的工作不是例如字符串解析器等。

如果內存變成問題,可能值得考慮在Matlab中實現您的問題的數學核心,並在其他更普遍可用的編程語言中完成其餘部分,並以某種方式將Matlab代碼與接口連接 - - 我自己並沒有嘗試過,但Mathworks有Matlab engine for python,我會爲每天使用Matlab存儲任意數據的東西編寫python,使用該引擎,您可以調用Matlab來完成您骯髒的數學工作,並使用python來完成您的日常腳本/編程工作。

請注意,我這裏的底線是,Matlab具有極大的數學程序,令人印象深刻的文件,但如果你想真正開發軟件,使用通用工具/語言更容易被快速滿足。

我甚至會說,它可能是值得你學習python的時間,只是爲了能夠規避處理matlab不是爲了設計的東西(並且單元陣列是什麼Matlab真的很複雜,什麼是非常容易的Python)。

+0

非常好的答案。太糟糕了,很多人被超過一個段落的文本嚇倒了) –

+0

@AndrasDeak:因此,第一個「TL; DR」段落;) –

+0

@AndrasDeak:儘管如此,我決定將我的文本構建成更多的段落優越的可讀性! –

0

您使用

a{2}=[] 

爲 '殺' 在這一領域中的數據。實際上,你實際上訪問數據,就是用一個空的double數組留下一個非空的單元格條目。 (感謝matlab將空單元表示爲空雙元...)

但如果使用(無大括號,括號,但):

a(2) = cell(1,1) 

然後單元陣列大小是回「空」 = 32個字節。