1. 程式人生 > >matlab大資料計算技巧(持續更新中)

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. 如有可能,儘量採用矩陣元素之間的運算,而不是直接的矩陣乘法