Matlab下大矩阵运算

通过memory和whos可以看到当前系统的内存使用情况和每个变量所占用的内存,例如:

  1. K>> memory   
  2. Maximum possible array:               7414 MB (7.774e+009 bytes) *   
  3. Memory available for all arrays:      7414 MB (7.774e+009 bytes) *   
  4. Memory used by MATLAB:                2433 MB (2.552e+009 bytes)   
  5. Physical Memory (RAM):                5823 MB (6.106e+009 bytes)   
  6.   
  7. *  Limited by System Memory (physical + swap file) available.  

可以看到本地机器的物理内存RAM有将近6G,最大可能内存7G左右,目前已经被Matlab使用的内存有2G多,通过whos指令可以知道有那些变量占用的内存比较大:

  1. K>> whos   
  2.   Name                      Size                    Bytes  Class     Attributes   
  3.      
  4.   temp_instance_2       20229×10059            1627868088  double                 
  5.   temp_instance_3       20229×10059               2095424  double    sparse                   
  6.   train_data                1×10059              86199419  struct                

可以看到同样20139*10059的矩阵,double型的full矩阵要占用1.6G左右的内存,double型的sparse矩阵只占用了2M左右内存。

在运算速度方面 tic,toc来知道每段代码的执行时间。但要知道每条语句的详细运行情况的话,非profile莫属。先运行profile on,再运行需要测试的代码,然后使用profile viewer来查看报告。

Sparse矩阵在指定下标的循环运算中不占优势。但是,当一个矩阵中有大量的0时就一定要采用sparse型进行运算,不只大大减少内存会消耗,而且时间消耗也会大大减少。注意,一般Sparse矩阵运算如sum, diag等之后还是sparse矩阵,而当sparse矩阵和full矩阵一起参加运算时,结果会被强制转为full矩阵。要注意,当一个矩阵并不是很稀疏时尽量不要采用sparse方式存储,不便于矩阵运算,对于一些矩阵操作,如求矩阵转置等操作会变得异常异常的慢!

下面是一个2W*2W的double型全1矩阵full型和sparse型的占内存情况:

  1. >> A = ones(20229,20229);   
  2. >> whos   
  3.   Name          Size                    Bytes  Class     Attributes   
  4.   
  5.   A         20229×20229            3273699528  double                 
  6.   
  7. >> A = sparse(A);   
  8. >> whos   
  9.   Name          Size                    Bytes  Class     Attributes   
  10.   
  11.   A         20229×20229            6547560896  double    sparse  

在Matlab中一定要尽量避免矩阵的for循环元素,如果遇到一定是无法避免的情况是,考虑采用bsxfun来取代for,bsxfun的使用格式和范围有:

  1. C = bsxfun(fun,A,B) appliesthe element-by-element binary operation specified by the function handle fun to arrays A and B,with singleton expansion enabled.fun can be one of the following built-in functions:   
  2. @plus Plus   
  3. @minus Minus   
  4. @times Array multiply   
  5. @rdivide Right array divide   
  6. @ldivide Left array divide   
  7. @power Array power   
  8. @max Binary maximum   
  9. @min Binary minimum   
  10. @rem Remainder after division   
  11. @mod Modulus after division   
  12. @atan2 Four quadrant inverse tangent   
  13. @hypot Square root of sum of squares   
  14. @eq Equal   
  15. @ne Not equal   
  16. @lt Less than   
  17. @le Less than or equal to   
  18. @gt Greater than   
  19. @ge Greater than or equal to   
  20. @and Element-wise logical AND   
  21. @or Element-wise logical OR   
  22. @xor Logical exclusive OR  

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>