美文网首页
【转】 Matlab中提高m文件执行效率的小技巧

【转】 Matlab中提高m文件执行效率的小技巧

作者: 我是谁的小超人 | 来源:发表于2017-12-01 11:04 被阅读0次

    要提高M文件的执行效率,可采用下述的一些技巧。

    1. 尽量避免使用循环结构
      MATLAB变量的基本类型是矩阵,当对矩阵的每个元素循环处理时,运算速度很慢。因此编程时应尽量把数组和矩阵看作一个整体来进行编程,而不是像其他的程序设计语言那样,使用循环结构对矩阵的元素循环进行处理。利用MATLAB提供的用于矢量化操作的函数,把循环矢量化,这样既可以提高编程效率,也可以提高程序的执行效率。下面给出一个循环的例子:
      i=0;
      for n = 0:0.1:100
      i=i+1;
      y(i)=cos(n)
      end

    上述程序段把数组中的每个元素都进行函数值计算,这样会耗费大量的运算时间,我们可以把数组看作一个整体来处理,计算函数值,可以修改这个程序段如下。

    n = 0:0.1:100;
    y = cos(n)

    通过使用MATLAB专门提供的测试程序运行时间的函数,可以发现,把数组看作一个整体,进行操作后,执行效率提高约300倍。

    另外,在必须使用多重循环的情况下,建议在循环的外环执行循环次数少的,内环执行循环次数多的,这样也可以显著提高程序执行速度。

    1. 在使用数组或矩阵之前先定义维数
      MATLAB中的变量在使用之前不需要明确地定义和指定维数。但当未预定义数组或矩阵的维数时,当需赋值的元素下标超出现有的维数时,MATLAB 就为该数组或矩阵扩维一次,这样就会大大降低程序的执行效率。因此,在使用数组或矩阵之前,预定义维数可以提高程序的执行效率。

    2. 对矩阵元素使用下标或者索引操作
      在MATLAB中,矩阵元素的引用可用两个下标来表示。例如:A(i,j) 表示矩阵的第i行第j列的元素;A(1:k,j)表示矩阵A的第j列的前k个元素;A(:,j) 表示矩阵的第j列的所有元素。求矩阵A的第j列元素的平均值的表达式为mean(A(:,j))。

    3. 尽量多使用函数文件少使用脚本文件
      因为每次调用MATLAB的脚本文件都需要将不必要的中间变量加载到内存中,每执行一次,就加载一次。函数在调用时被编译成了伪代码,只需要加载到内存一次。当多次调用同一个函数时会运行快一些。因此尽量多使用函数文件而少使用脚本文件,也是提高执行效率的一种方法。

    4. 在必须使用循环时,可以考虑转换为C-MEX
      当必须使用耗时的循环时,可以考虑将循环体中的语句转换为C-MEX。C-MEX是将M文件通过MATLAB 的编译器转换为可执行文件,是按照 MEX 技术要求的格式编写相应的程序,通过编译连接,生成扩展名为.dll的动态链接库文件,可以在MATLAB环境下直接执行。这样,循环体中的语句在执行时不必每次都解释(interpret)。一般来说,C-MEX 文件的执行速度是相同功能的M文件执行速率的20~40倍。编写C-MEX不同于M文件,需要了解MATLAB C-MEX规范。幸运的是MATLAB提供了将M文件转换为C-MEX的工具。

    5. 内存优化
      MATLAB在进行复杂的运算时需要占用大量的内存。合理使用内存和提高内存的使用效率,可以加快运行速度,减少系统资源的占用。

    6. 内存管理函数和命令
      ● Clear variablename:从内存中删除名称为variablename的变量。
      ● Clear all:从内存中删除所有的变量。
      ● Save:将指令的变量存入磁盘。
      ● Load:将save命令存入的变量载入内存。
      ● Quit:退出MATLAB,并释放所有分配的内存。
      ● Pack:把内存中的变量存入磁盘,再用内存中的连续空间载回这些变量。考虑到执行效率问题,不能在循环中使用。

    7. 节约内存的方法
      ● 避免生成大的中间变量,并删除不再需要的临时变量。
      ● 当使用大的矩阵变量时,预先指定维数并分配好内存,避免每次临时扩充维数。
      ● 当程序需要生成大量变量数据时,可以考虑定期将变量写到磁盘,然后清除这些变量。当需要这些变量时,再重新从磁盘加载。
      ● 当矩阵中数据极少时,将全矩阵转换为稀疏矩阵。

    相关文章

      网友评论

          本文标题:【转】 Matlab中提高m文件执行效率的小技巧

          本文链接:https://www.haomeiwen.com/subject/ipbibxtx.html