matlab大資料計算技巧(持續更新中)
在matlab中, 當資料比較大時,運算起來就困難了,有時候還會out of memory(例如4000*4000的矩陣,要算矩陣乘法都比較吃力)。此文會記錄我學到的一些解決辦法:
1. 將資料的儲存型別從double轉換成single
在matlab中double資料型別佔8個位元組,single型別佔4個位元組。把資料型別從double型別轉換成single型別可以節省一半的空間。
單精度浮點數single的取值範圍可以通過[-realmax('single'), -realmin('single')] U [ realmin('single'), realmax('single')]檢視,可以發現其範圍一般是足夠我們使用了。
2. 避免使用高維矩陣
當資料量很大時,使用高維矩陣無疑是雪上加霜,可以考慮使用多個低維矩陣。
例如有3個N*N的矩陣(K1,K2,K3),為了程式書寫的方便,可以把這三個矩陣儲存在一個N*N*3的矩陣K中,那麼使用這三個矩陣時就只通過K來訪問。但是,當N比較大時,三維矩陣K就更大了,很容易造成out of memory。 所以為了避免out of memory,還是使用多個二維矩陣比較好(與其分配一個更大的空間給K,不如分配多個小矩陣,雖然總量一樣),可是這樣取用這三個矩陣卻不方便了。下面給出我的解決方案:
N = 5000;
K1 = rand(N,N);
K2 = rand(N,N);
K3 = rand(N,N);
a = ['K1'; 'K2'; 'K3']; % 將這三個矩陣的名字存成字串矩陣
B1=eval(a(1,:)); % 通過eval()函式來取用K1
B2=eval(a(2,:)); % 取用K2
B3=eval(a(3,:)); % 取用K3
這裡用到的eval函式的功能強大,可以將字串的內容當做matlab命令來執行(Execute string containing MATLAB expression)
3. 及時清理不用變數,特別是大資料矩陣。及時清理可以騰出空間。同時,在生成矩陣的時候最好一次性申請足夠的空間,不要在程式執行的時候變化矩陣大小。
4. 如有可能,儘量採用矩陣元素之間的運算,而不是直接的矩陣乘法