




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1、. Ctrl+C 中断正在执行的操作如果程序不小心进入死循环,或者计算时间太长,可以在命令窗口中使用Ctrl+c来中断。MATLAB这时可能正疲于应付,响应会有些滞后。2. figure命令新建一个绘图窗口figure 可以打开一个空的绘图窗口,接下的绘图命令可以将图画在它里面,而不会覆盖以前的绘图窗口。当有多个figure窗口时,在命令窗口中执行如Plot等命令将覆盖当前figure窗口中的对象。所谓的当前figure窗口,也就是最后一次查看的窗口(可以用命令gcf得到)。figure(N),将编号为N的窗口置为当前figure,出现在所有窗口的最前面,如果该窗口不存
2、在,则新建一个编号为N的空白figure。3. 注释掉一段程序:%、%。经典方法是用 if 0,但缺点是不够直观,注释掉的内容仍然保持代码的颜色。现在可以用 %和 的组合。输入%后,后面的代码都会变绿,在注释结束的地方再加上 % 。也可以选中要注释内容,在右键菜单中选择Comment (Uncomment去掉注释标记),或使用快捷键Ctrl+R。将光标放在需要注释的行中,按Ctrl+R,将该行变为注释。取消注释也是一样的,快捷键为Ctrl+T。4. doc 命令名,打开命令的帮助文档与help命令不同,帮助文档MATLAB
3、Help中对命令的描述更详细,往往还有一些例子,更便于理解。5. clc 清屏清除命令窗口中的所有输入和输出信息,不影响命令的历史记录。6. clear 和clear allclear 变量名:可以清除workspace中的无用的变量,尤其是一些特别大的矩阵,不用时及时清理,可以减少内存占用。clear all 清除所有的变量,使workspace一无所有,当重新开始一次算法验证时,最好执行一次,让workspace中的变量一目了然。7. close all如果开了多个绘图窗口,用这个命令将它们一起关掉。8. 上下光标键在命令窗口中,上下光标键
4、可以将历史记录中的命令复制到输入位置,便于快速重新执行。如果输入命令的前几个字母如 row, col =,再使用光标键,则只会选择以这些字母开始的命令。9. Tab补全对名称记得不太清楚的命令,可以输入开头的几个字母,然后按Tab键,当只有一个以这些字母开头的命令时,将自动补全命令名,否则显示一个命令名列表,方便从中选择。当然,只在命令窗口中有效。10. cell模式在一个长长的脚本m文件中,可能需要对其中的一段反复修改,查看执行效果,这时,cell模式就非常有用了。cell模式相当于将其中的代码拷贝到命令窗口中运行。两个%后接一个空格(% )开始一个cell。将输入光标放到一个ce
5、ll中时,背景将变为浅黄色,Ctrl+Enter执行cell中的代码。执行cell中代码时不需要保存m文件,该m文件可以不在路径列表中。cell模式中,断点不起作用,当然,调用的子程序中的断点还是正常的。11. 获取文件列表,批处理MATLAB内置了一些文件操作命令,例如cd(切换工作目录),dir(同ls,显示目录内文件列表)等。dir命令可以返回目录中的文件和文件夹列表,存在一个结构体数组中。如果需要对一些数据文件进行批处理,而文件名又没有一定的规律,你可能需要借助于这个命令。 Matlab注释技巧1. m文件如果是函数,保存的文件名最好与函数名一致,这点都很清楚。不过
6、容易疏忽的是,m文件名的命名尽量不要是简单的英文单词,最好是由大小写英文/数字 /下划线等组成。原因是简单的单词命名容易与matlab内部函数名同名,结果会出现一些莫名其妙的错误。例如,写个m文件,命名为spy,运行时就弹出一个怪怪的figure,呵呵,我当初还以为是什么bug。2. 调试程序时,经常要屏蔽掉一整段程序进行,也就是将其标示注释符%。有两个办法:一种是选定后 ctrl+r和ctrl+t 一种是在段首加 if 0 ,段尾加 end,中间都不执行,也就相当于注释掉了3. 写m文件时,选中某段程序内容,ct
7、rl+i 让matlab帮你自动对齐程序。这样程序看起来很有层次,容易发现程序中的错误。4. ctrl+F2作标签,ctrl+g 跳至某一行,这些快捷键都很实用。5 matlab7中有块注释符号% 和 %6 多行加标注时,也可以选中需要添加标注程序,然后在Edit中/或者右键选择Comment。或者Uncomment除掉标注 MATLAB内存管理用 Matlab 进行大规模科学计算或仿真时,内存是一个需要时常注意的问题。在matlab里运行>>system_dependent memstats就可以看到
8、内存的使用状况。当你写的 Matlab 程序跳出“Out of Memory” 时,以下几点措施是需要优先考虑的解决方法:1. 升级内存2. 升级64位系统3. 增加虚拟内存4. 采用3GB开关启动系统由于32位 Windows 操作系统的限制,每个进程只能使用最多 2GB 的虚拟内存地址空间,因此 Matlab 的可分配内存也受到相应的限制。Matlab 7.0.1 引进了新的内存管理机制,可以利用 Windows 的 3G
9、B 开关,使用 3GB 开关启动的 Windows 每个进程可以在多分配 1 GB 的虚拟地址空间。具体做法是:修改C盘根目录 boot.ini 启动选项加上 /3G,例如:multi(0)disk(0)rdisk(0)partition(1)WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /3G5. 如果必有必要,不要启动java虚拟机,采用matlab -nojvm
10、启动 (在快捷方式属性里面的 "./matlab.exe") 改为("./matlab.exe" - nojvm)6. 关闭Matlab Server7. Windows中字体、窗口等都是要占用系统资源的,所以在Matlab运行时尽量不要打开不用的窗口。除此以外,更关键的是需要弄清楚以下几个问题:问题一:Matlab是如何存储矩阵的?Matlab中矩阵是以Block,也就是块的形式存储的。也就是说,当Matlab在为即将存储的矩阵划分块时,如果没有相应大小的连续内存,即使实际内存没有被完全使用,它还是会报告“Out
11、 of Memory”。问题二:如何高效使用Memory?Matlab 中数组必须占用连续分配的内存段,当无法为新建的数组分配连续的内存段的时候,”Out of Memory” 就会出现。在使用的过程中,由于存储单元的不断的被分配和清除,反复分配和释放数组会使内存被分割成不连续的区域,可用的连续内存段减少,很容易造成 “Out of Memory”。因此当Matlab 刚刚启动时其连续内存最多,此时往往可以新建非常大的数组,这一点可以用命令 feature(memstats)(在 7.0 版本以上)看出。如果现实的最大连续内
12、存段很小,但实际可用内存(非连续的)仍旧很多,则表明内存中碎片太多了。此时可以考虑用 pack 命令,pack 命令的作用就是将所有内存中的数组写入硬盘,然后重新建立这些数组,以减少内存碎片。此外,在命令行或者程序中都可以使用 clear 命令,随时减少不必要的内存。因此,治本的方法如下:1. 在命令行输入 pack 整理内存空间当内存被分为很多碎片以后,其实本身可能有很大的空间,只是没有作构的连续空间即大的Block而已。如果此时Out of Memory,此时使用pack命令可以很好的解决此问题。2.
13、;使用稀疏矩阵或将矩阵转化成稀疏形式 sparse如果矩阵中有大量的0,最好存储成稀疏形式。稀疏形式的矩阵使用内存更少,执行时间更短。例如:000×1000的矩阵X,它2/3的元素为0,使用两种存储方法的比较:NameSizeBytesClassX1000x10008000000double arrayY1000x10004004000double array (sparse)3. 尽量避免产生大的瞬时变量,把没必要的变量clear掉或当它们不用的时候应该及时clear。4. 减少变量,尽量的重复使用变量(跟不用的clear掉一个意思)。5.
14、把有用的变量先save,后clear 掉,需要时再读出来。下面介绍一下关于clear、save、load的特殊用法,这对在for或while等多重循环里出现out of memory非常有效。for k = 1:N % N为循环次数% - var0 = k; % 获得变量var0
15、160; %- string = sprintf('var_%d', k) ' = var0;' ; eval(string); &
16、#160; % 等价于 var_k = var0; save(sprintf('var_%d.mat', k),
17、 sprintf('var_%d'); % 等价于 save var_k.mat var_k clear(sprintf('var_%d');
18、 % 等价于 clear var_kend如果要读取刚才存取的变量var_k, (k = 1,2, ., N). 那么,可以使用如下用法:for k = 1:N load(sprintf('var_%d.mat', k); % 等价于 load var_k.mat
19、 k = 1,2, ., Nend另外,还有一些非常有用的用法。如果用清除刚才读取的变量 var_k, k = 1, 2, ., Nclear '-regexp' 'var_' % 清除所有以“ var_ ”开头的变量还有很多关于save、clear、load等用法,具体help一下。6. 使用单精度 single 短整数替代双精度 doubleMatlab 默认的数字类型是双精度浮
20、点数 (double),每个双浮点数占用 8 个字节。对于一些整数操作来说,使用双浮点数显得很浪费。在 Matlab 中可以在预先分配数组时指定使用的数字类型如以下命令:zero(10, 10, uint8) 。对于浮点数,在很多精度要求不高的情况下,可以使用4个字节的单浮点数(single),可以减少一半的内存。关于单、双浮点数的精度对照如下,以便根据需要选择使用:single: 精度 (1.1921e-007) 最大数 (3.4028e+038)double: 精度
21、60;(2.2204e-016) 最大数 (1.7977e+308)7. 为矩阵变量预制内存而不是动态分配在动态分配的过程中,由于开始Matlab所用的Block随着矩阵的增大而连续的为此矩阵分配内存,但是由于Block的不连续性,很有可能最开始分配的Block不能满足存储的需要,Matlab只好移动此Block以找到更大的Block来存储,这样在移动的过程中不但占用了大量的时间,而且很有可能它找不到更大的块,导致Out of Memory。而当你为矩阵变量预制内存时,Matlab会在计算开始前一次性找到最合适的Block,此时就不用为变量连续的分配内存。比较下面
22、两个程序:for k = 2:1000 x(k) = x(k-1) + 5;endx = zeros(1, 1000);for k = 2:1000 x(k) = x(k-1) + 5;end显然,第二个更好!最好的方法是,在程序一开始就位所有大的矩阵变量预制存存储单元!8. 尽量早的为大的矩阵变量预制内存Matlab使用heap method管理内存。当在Matlab heap中没有足够的内存使用时,它会向系统请求内存。但是只要内存碎片可以存下当前的变量,Matlab会重新使用内存。比如:a
23、 = rand(1e6,1);b = rand(1e6,1);使用大约15.4 MB RAMc = rand(2.1e6,1);使用近似16.4 MB RAMa = rand(1e6,1);b = rand(1e6,1);clearc = rand(2.1e6,1);使用32.4 MB RAMMatlab不能使用a、b被clear的空间,因为它们均小于2.1 MB,而同时它们也很可能是不连续的。最好的方法:c = rand(2.1e6,1);cleara = rand(1e6,1);b = rand(1e6,1);使用16.4 MB RAM9. 如果可行的话,将一个大的矩阵划分为几个
24、小的矩阵,这样每一次使用的内存减少。 Matlab中的保存数据语句比较在Matlab中,我们经常遇到需要将一些中间数据或者最终结果保存为文本形式(*.txt);其中提供了多种保存数据的语句,应该如何选择喃?在此,小弟在使用了fprintf、save、dlmwrite的基础上,对这三种方法进行了一个比较:fprintf(fid, format, A, .),将数据A以format表示的格式写入fid(文件)中,fid由fopen函数返回得到。实例: x = 0:.1:1;A = x; exp(x);fid = fopen('exp.txt
25、9;, 'wt');fprintf(fid, '%6.2f %12.8fn', A);fclose(fid)save filename.txt A -format,将数据A以format表示的格式写入filename文本文件中。实例: x = 0:.1:1;A = x; exp(x);save data.txt A -ASCIIdlmwrite('filename.txt', A, 'D', R, C),从矩阵A的第R行、第C列开始,使用分隔符D分割数据(“t”表示
26、tab分割,“,”为默认分割符),存储到filename文本文件中。实例: x = 0:.1:1;A = x; exp(x);dlmwrite(data.txt', A, 'delimiter', 't', 'precision', 6);使用时,save保存的数据是以科学计数法的方式存储的;fprintf和dlmwrite则是可以选择存储数据的方式,fprintf的格式设置跟C语言中的用法一致,dlmwrite可以设置有效位位数,比如上面实例中6表示有效位位数是6位,dlmwrite中对数据中的小数就采用浮点数存储
27、,整数就采用整型存储形式。在使用时,可根据自己实际情况的需要选择适合的一种。个人觉得matlab本身的这种以科学计数法来表示数据,有时不方便于查看。还有一点就是fprintf是按照矩阵列存储。 MATLAB Out of memory问题总结(转载)首先,我要声明,matlab自带的Help才是最权威的Matlab学习资料,如果有时间好好学习一下或是可以高效的使用的话,一定受益匪浅!比如说像 Out of Memory这个问题,最开始我都是用Help memory,几乎得不到任何信息;然后就是去网上搜索此类问题的解决方法,一般有这几种:除了升级内存和升级64位系统外,下面几
28、个方法也是解决之道。# 增加虚拟内存# 采用PACK (在命令行输入 pack 整理内存空间)# 采用3GB 开关启动系统(修改 c盘根目录 boot.ini 启动选项加上 /3G 例如:multi(0)disk(0)rdisk(0)partition(1)WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /3G# 优化程序,减少变量 (使用
29、稀疏矩阵 sparse ) save 保存变量 load 变量,需要时再读出来# 如果必有必要,不要启动java虚拟机,采用matlab -nojvm启动 (在快捷方式属性里面的 "./matlab.exe") 改为("./matlab.exe" - nojvm)#关闭Matlab Server # 使用 单精度 single 短整数替代 双精度。现在看来这些解决方法对于我的问题来说根本就是“治标
30、不治本”,不能解决实际问题,后来在一个师兄的提醒下Help out of memory,终于找到了解决此类问题的方法。在此感谢这位师兄啊!重申Matlab的Help才是Matlab的最权威的指导材料!其实我的所谓原创就是对Help out of memory的一些归纳总结而已,有兴趣的话大家可以自己去看!问题一:Matlab是如何存储矩阵的Matlab中矩阵是以Block,也就是块的形式存储的。也就是说,当Matlab在为即将存储的矩阵划分块时,如果没有相应大小的连续内存,即使实际内存没有被完全使用,他还是会报告“Out of Memory”。问题二:如何高效使用Memory由于在使用的过程中
31、,由于存储单元的不断的被分配和清除,内存会被分割成不连续的区域,这是很容易造成“Out of Memory”。1为矩阵变量预制内存而不是动态分配在动态分配的过程中,由于开始Matlab所用的Block随着矩阵的增大而连续的为此矩阵分配内存,但是由于Block的不连续性,很有可能最开始分配的Block不能满足存储的需要,Matlab只好移动此Block以找到更大的Block 来存储,这样在移动的过程中不但占用了大量的时间,而且很有可能它找不到更大的块,导致Out of Memory。而当你为矩阵变量预制内存时,Matlab会在计算开始前一次性找到最合适的Block,此时就不用为变量连续
32、的分配内存。比较下面两个程序:for k = 2:1000x(k) = x(k-1) + 5;endx = zeros(1, 1000);for k = 2:1000x(k) = x(k-1) + 5;end显然,第二个更好!最好的方法是,在程序一开始就位所有大的矩阵变量预制存存储单元!1尽量早的分配大的Matlab使用heap method管理内存。当在Matlab heap中没有足够的内存使用时,它会向请求内存。但是只要内存碎片可以存下当前的变量,Matlab会重新使用内存。比如:a = rand(1e6,1);b = rand(1e6,1);使用大约15.4 MB RAMc = rand
33、(2.1e6,1);使用近似16.4 MB RAM:a = rand(1e6,1);b = rand(1e6,1);clearc = rand(2.1e6,1);使用32.4 MB RAM。因为Matlab不能使用a、b被clear的空间,因为它们均小于2.1 MB,而同时它们也很可能是不连续的。最好的方法:c = rand(2.1e6,1);cleara = rand(1e6,1);b = rand(1e6,1);使用16.4 MB RAM2尽量避免产生大的瞬时变量,当它们不用的时候应该及时clear。3尽量的重复使用变量(跟不用的clear掉一个意思)4将矩阵转化成稀疏形式如果矩阵中有大量
34、的0,最好存储成稀疏形式。稀疏形式的矩阵使用内存更少,执行时间更短。例如:1000×1000的矩阵X,它2/3的为0,使用两种存储方法的比较:NameSizeBytesClassX1000x10008000000double arrayY1000x10004004000double array (sparse)5使用pack当内存被分为很多碎片以后,其实本身可能有很大的空间,只是没有作构的连续空间即大的Block而已。如果此时Out of Memory,此时使用pack命令可以很好的解决此问题。6如果可行的话,将一个大的矩阵划分为几个小的矩阵,这样每一次使用的内存减少。7增大内存问题三: Increase the size of the swap file.wap space的与使用的操作系统有关,具体的如下:1.UNIXInformation about swap space can be procured by typing pstat -s at the UNIX command prompt. For detailed information on changing
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水管维修协议书
- 六年级学生心理安全教育计划
- 汽车刮蹭协议书
- 校园健康体检与教育计划
- 高三语文选修课开展计划
- 2025-2030年中国双人婴儿车行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年中国卫浴设备和配件行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年中国医师分配的护肤产品行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年中国办公协同软件行业市场深度调研及竞争格局与投资研究报告
- 公司业务代理协议具体规定与实施细则说明
- 2024年浙江省仙居县事业单位公开招聘教师岗笔试题带答案
- 五年级数学下试卷及答案
- 儿童性早熟课件
- 生活垃圾合同终止协议
- 山东能源电力集团招聘笔试题库2025
- 医疗技术品牌的创新与传播策略
- 陪护公司管理制度规范
- SL631水利水电工程单元工程施工质量验收标准第2部分:混凝土工程
- 2024年天津卷高考语文真题含解析
- 感染性腹泻患者护理常规
- 笔记分享的保安证考试试题及答案
评论
0/150
提交评论