片以后,其实本身可能有很大的空间,只是没有作构的连续空间即大的Block而已。如果此时Out of Memory,此时使用pack命令可以很好的解决此问题。 2. 使用稀疏矩阵或将矩阵转化成稀疏形式 sparse 如果矩阵中有大量的0,最好存储成稀疏形式。稀疏形式的矩阵使用内存更少,执行时间更短。例如: 000×1000的矩阵X,它2/3的元素为0,使用两种存储方法的比较: Name Size Bytes Class X 1000x1000 8000000 double array Y 1000x1000 4004000 double array (sparse) 3. 尽量避免产生大的瞬时变量,把没必要的变量clear掉或当它们不用的时候应该及时clear。 4. 减少变量,尽量的重复使用变量(跟不用的clear掉一个意思)。 5. 把有用的变量先save,后clear掉,需要时再读出来。 下面介绍一下关于clear、save、load的特殊用法,这对在for或while等多重循环里出现out of memory非常有效。 for k = 1:N % N为循环次数 % --------------------- var0 = k; % 获得变量var0 %---------------------- string = [sprintf('var_%d', k) ' = var0;' ]; eva l(string); %等价于 var_k = var0; save(sprintf('var_%d.mat', k), sprintf('var_%d')); %等价于 save var_k.mat var_k clear(sprintf('var_%d')); %等价于 clear var_k end 如果要读取刚才存取的变量var_k, (k = 1,2, ..., N). 那么,可以使用如下用法: for k = 1:N load(sprintf('var_%d.mat', k)); %等价于 load var_k.mat k = 1,2, ..., N end 另外,还有一些非常有用的用法。如果用清除刚才读取的变量 var_k, k = 1, 2, ..., N clear '-regexp' '^var_' % 清除所有以“ var_”开头的变量 还有很多关于save、clear、load等用法,具体help一下。 6. 使用单精度 single短整数替代双精度 double Matlab 默认的数字类型是双精度浮点数 (double),每个双浮点数占用 8个字节。对于一些整数操作来说,使用双浮点数显得很浪费。在 Matlab 中可以在预先分配数组时指定使用的数字类型如以下命令:zero(10, 10, ‘uint8′)。对于浮点数,在很多精度要求不高的情况下,可以使用4个字节的单浮点数 (single),可以减少一半的内存。关于单、双浮点数的精度对照如下,以便根据需要选择使用: single: 精度 (1.1921e-007)最大数 (3.4028e+038) double: 精度 (2.2204e-016)最大数 (1.7977e+308)
|