1、建立和修改陣列——基本思想是保持記憶體的連續性(1)當為陣列賦值時,Matlab在記憶體中分配連續的虛擬塊,在另一個地方,將陣列的型別和維數等儲存為頭資訊。(2)當向陣列增加新元素時,如果原來位置的連續記憶體區域可以容納新增加的資料,則擴大分配的記憶體,然後增加元素;如果連續塊不夠大,需要先重新分配能夠容納原有資料和新增資料的連續記憶體塊,再將原有資料複製到新分配的記憶體中(在此期間,記憶體中會有原來資料的兩份複製,增加了out of memory的風險),並新增新的元素到新的塊中,然後釋放原來的記憶體。(3)當刪除陣列元素時,先移除元素,再壓縮原來分配的空間。
5、記憶體佔用計算(1)元胞陣列佔用的空間計算方法為:(header_size x number_of_cells) + data,對於64位系統,header_size為112,檢視header_size的方法: A = {[]}, whos A。A = {1 2 3}, A = {[1 2 3]}, A = {{1 2 3}}佔用的位元組數分別為:112×3+8×3,112×1+8×3,112×4+8×3。(2)64bit系統中結構體佔用空間的計算方法:fields x ((112 x array elements) + 64) + data (32bit系統中將112改為60)。
1、建立和修改陣列——基本思想是保持記憶體的連續性(1)當為陣列賦值時,Matlab在記憶體中分配連續的虛擬塊,在另一個地方,將陣列的型別和維數等儲存為頭資訊。(2)當向陣列增加新元素時,如果原來位置的連續記憶體區域可以容納新增加的資料,則擴大分配的記憶體,然後增加元素;如果連續塊不夠大,需要先重新分配能夠容納原有資料和新增資料的連續記憶體塊,再將原有資料複製到新分配的記憶體中(在此期間,記憶體中會有原來資料的兩份複製,增加了out of memory的風險),並新增新的元素到新的塊中,然後釋放原來的記憶體。(3)當刪除陣列元素時,先移除元素,再壓縮原來分配的空間。
2、陣列的複製(1)當將一個數組賦值給另一個變數時,不會為新變數分配記憶體,新變數只是到原來陣列的引用,直到新變數中元素值改變時,才會為其分配記憶體。(2)透過引數傳遞給函式的資料,當資料內容發生改變時才會分配記憶體,函式內部新的資料透過返回值傳遞給呼叫該函式的函式。
3、陣列頭(1)由於陣列頭佔據儲存空間(雖然不多),資料存放在幾個大陣列中要由於存放在多個小陣列中。(2)對結構體和元胞(cell)陣列,Matlab不僅為他們建立頭資訊,還為結構體的每個欄位和元胞陣列的每個元素建立頭資訊,因此結構題和元胞陣列消耗的記憶體與其建立方式有關。(3)whos函式只能檢視資料佔用的儲存空間,不會顯示頭資訊佔用的空間。
4、資料結構與記憶體(1)8-bit、16-bit、32-bit、64-bit的有符號整型或無符號整型分別佔用1、2、4、8位元組空間,單精度、雙精度浮點數分別佔用4、8位元組空間。(2)複數的實部和虛部分別佔用存貯空間,當修改實部或虛部時,會同時複製實部和虛部。(3)當陣列的元素絕大部分為0時,用稀疏矩陣存貯以節省空間。
5、記憶體佔用計算(1)元胞陣列佔用的空間計算方法為:(header_size x number_of_cells) + data,對於64位系統,header_size為112,檢視header_size的方法: A = {[]}, whos A。A = {1 2 3}, A = {[1 2 3]}, A = {{1 2 3}}佔用的位元組數分別為:112×3+8×3,112×1+8×3,112×4+8×3。(2)64bit系統中結構體佔用空間的計算方法:fields x ((112 x array elements) + 64) + data (32bit系統中將112改為60)。