因为csdn似乎不能按照完整的格式,全文在文章末尾,可下载
1. 改善运行的技巧
1.1 分析程序的运行状况
1) Profiler工具
使用Profiler工具找到话费时间比较多的代码行的位置并优化这些代码
2) 查看运行时间的函数
tic
--程序段
time=toc
3) 计算短程序运行所花费的时间
有的程序很短,运行时,速度太快,以至于使用tic和toc不能得到有用的信息,可尝试把程序放到一个循环中来计算
tic
for k=1:100
--运行程序100次
end
toc
1.2 循环矢量化
1) 矢量化方法
矢量化是指将for循环和while循环转换为等价的矢量或矩阵操作
2) 使用矢量化的函数
Table 1 MATLAB中使用了矢量化的函数
all diff ipermute permute reshape squeeze
any find logical prod shiftdim sub2ind
cumsum ind2sub ndgrid repmat sort sum
1.3 数组的内存预分配
1) 给数组预分配内存
预分配使得不必在每次数组变大时进行改变,针对不同类型的数组使用合适的预分配函数
数组类型 预分配函数 示例
数值数组 zeros y=zeros(1,100)
单元数组 cell B=cell(2,3);
B{1,3}=1:3;
B{2,2}=’string’;
结构数组 struct
repmat data=repmat(struct(‘x’.[1 3],…
‘y’,[5 6]),1,3);
2) 给非double型矩阵预分配内存
下面的语句用zeros函数预分配一个uint8型100*100的矩阵,首先,创建一个double型满秩矩阵,然后把矩阵转换为uint8型,这将导致不必要的时间和内存花费
A=int8(zeros(100));
使用repmat函数,只需要创建一个double值,从而减少了对内存的需求
A=repmat(int8(0),100,100);
在不能进行预分配的时候,看是否能通过repmat函数使数组变大,用repmat函数扩展矩阵时,可以获得连续的内存块
1.4 其他方法
1) 用MEX文件编写循环代码
必须使用for循环时,把它写为MEX文件,因为不必在每次运行循环中的语句时都对他们进行解释
2) 操作实型数据
MATLAB特意为实数设计了一些函数,如reallog,realpow,realsqrt等
3) 函数比脚本运行更快
4) 使用load函数和save函数比Matlab文件I/O过程更好
5) 避免大型后台处理
2. 程序运行情况监测-Profiler
Profiler是一个能够检测程序运行状况的工具,它告诉你M文件中哪些代码行最花费时间,哪些行被调用的次数最多,然后就可以利用上面的方法对这些代码进行改进。
其实也可以使用Profiler理解文件,对于很长不是自己创建的M文件,或者其他不熟悉的M文件,可以使用Profiler查看M文件是如何工作的,用详细报表查看隔行的实际调用情况。
3. 使用Profile函数
Profiler的运行是基于profile函数返回的结果的,但有一些profile函数具有的特点Profiler中并没有,具体查看help
4. 有效使用内存
1) 内存管理函数
使用下面这些函数,可以帮助在Matlab中管理内存
(1) whos函数:显示给工作空间中的变量分配了多少内存
(2) pack函数:把已经存在的变量保存到磁盘,然后重新存入,这将减少因为内存碎片出问题的机会
(3) clear函数:从内存中删除变量,增加可用内存的一种方法是周期性地把不再使用的变量从内存中清楚出去
(4) save函数:有选择地把变量保存到磁盘,使用大量数据时,这是一个有用的技巧
(5) load函数:重新载入数据文件
(6) quit函数:退出matlab并返回所有分配的内存到系统中
2) 节约内存的方法
本节介绍帮助你更节约内存,并避免出现“out of memory”的错误
(1) 使用变量
• 避免创建大型临时性变量,不再需要时清楚他们
• 使用固定大小的数组时,尽量进行预分配
• 将变量设置为空矩阵[],将他从内存中清除,或用clear函数
• 尽量重用变量
(2) 把数据压入内存
因为Matlab用堆管理内存,所以运行时会产生内存碎片,使内存产生很多闲置的空间,当闲置空间太多时,就没有足够的内存保存新的大型变量,并导致“Out of memory”错误产生,此时,可使用pack函数把数据压入内存,从而把更多相邻的内存块释放出来。
注:从时间上考虑,不要在循环或M文件函数中使用pack函数
(3) 有大量数据的情况
如果程序生成大量数据,建议周期性地把数据写入磁盘,保存一部分数据之后,从内存中清除变量并继续生成数据。
(4) 把满秩矩阵转换为稀疏矩阵
大部分元素为0的矩阵最好保存为系数矩阵,使用sparse函数进行转换
Reference
[1] Matlab高级编程/苏金明,刘宏,刘波编著—北京:电子工业出版社,2005.8
1. 改善运行的技巧
1.1 分析程序的运行状况
1) Profiler工具
使用Profiler工具找到话费时间比较多的代码行的位置并优化这些代码
2) 查看运行时间的函数
tic
--程序段
time=toc
3) 计算短程序运行所花费的时间
有的程序很短,运行时,速度太快,以至于使用tic和toc不能得到有用的信息,可尝试把程序放到一个循环中来计算
tic
for k=1:100
--运行程序100次
end
toc
1.2 循环矢量化
1) 矢量化方法
矢量化是指将for循环和while循环转换为等价的矢量或矩阵操作
2) 使用矢量化的函数
Table 1 MATLAB中使用了矢量化的函数
all diff ipermute permute reshape squeeze
any find logical prod shiftdim sub2ind
cumsum ind2sub ndgrid repmat sort sum
1.3 数组的内存预分配
1) 给数组预分配内存
预分配使得不必在每次数组变大时进行改变,针对不同类型的数组使用合适的预分配函数
数组类型 预分配函数 示例
数值数组 zeros y=zeros(1,100)
单元数组 cell B=cell(2,3);
B{1,3}=1:3;
B{2,2}=’string’;
结构数组 struct
repmat data=repmat(struct(‘x’.[1 3],…
‘y’,[5 6]),1,3);
2) 给非double型矩阵预分配内存
下面的语句用zeros函数预分配一个uint8型100*100的矩阵,首先,创建一个double型满秩矩阵,然后把矩阵转换为uint8型,这将导致不必要的时间和内存花费
A=int8(zeros(100));
使用repmat函数,只需要创建一个double值,从而减少了对内存的需求
A=repmat(int8(0),100,100);
在不能进行预分配的时候,看是否能通过repmat函数使数组变大,用repmat函数扩展矩阵时,可以获得连续的内存块
1.4 其他方法
1) 用MEX文件编写循环代码
必须使用for循环时,把它写为MEX文件,因为不必在每次运行循环中的语句时都对他们进行解释
2) 操作实型数据
MATLAB特意为实数设计了一些函数,如reallog,realpow,realsqrt等
3) 函数比脚本运行更快
4) 使用load函数和save函数比Matlab文件I/O过程更好
5) 避免大型后台处理
2. 程序运行情况监测-Profiler
Profiler是一个能够检测程序运行状况的工具,它告诉你M文件中哪些代码行最花费时间,哪些行被调用的次数最多,然后就可以利用上面的方法对这些代码进行改进。
其实也可以使用Profiler理解文件,对于很长不是自己创建的M文件,或者其他不熟悉的M文件,可以使用Profiler查看M文件是如何工作的,用详细报表查看隔行的实际调用情况。
3. 使用Profile函数
Profiler的运行是基于profile函数返回的结果的,但有一些profile函数具有的特点Profiler中并没有,具体查看help
4. 有效使用内存
1) 内存管理函数
使用下面这些函数,可以帮助在Matlab中管理内存
(1) whos函数:显示给工作空间中的变量分配了多少内存
(2) pack函数:把已经存在的变量保存到磁盘,然后重新存入,这将减少因为内存碎片出问题的机会
(3) clear函数:从内存中删除变量,增加可用内存的一种方法是周期性地把不再使用的变量从内存中清楚出去
(4) save函数:有选择地把变量保存到磁盘,使用大量数据时,这是一个有用的技巧
(5) load函数:重新载入数据文件
(6) quit函数:退出matlab并返回所有分配的内存到系统中
2) 节约内存的方法
本节介绍帮助你更节约内存,并避免出现“out of memory”的错误
(1) 使用变量
• 避免创建大型临时性变量,不再需要时清楚他们
• 使用固定大小的数组时,尽量进行预分配
• 将变量设置为空矩阵[],将他从内存中清除,或用clear函数
• 尽量重用变量
(2) 把数据压入内存
因为Matlab用堆管理内存,所以运行时会产生内存碎片,使内存产生很多闲置的空间,当闲置空间太多时,就没有足够的内存保存新的大型变量,并导致“Out of memory”错误产生,此时,可使用pack函数把数据压入内存,从而把更多相邻的内存块释放出来。
注:从时间上考虑,不要在循环或M文件函数中使用pack函数
(3) 有大量数据的情况
如果程序生成大量数据,建议周期性地把数据写入磁盘,保存一部分数据之后,从内存中清除变量并继续生成数据。
(4) 把满秩矩阵转换为稀疏矩阵
大部分元素为0的矩阵最好保存为系数矩阵,使用sparse函数进行转换
Reference
[1] Matlab高级编程/苏金明,刘宏,刘波编著—北京:电子工业出版社,2005.8