[转载]Matlab实用小技巧——Matlab学习笔记

1、. Ctrl+C 中断正在执行的操作

如果程序不小心进入死循环,或者计算时间太长,可以在命令窗口中使用Ctrl+c来中断。MATLAB这时可能正疲于应付,响应会有些滞后。

2. figure命令新建一个绘图窗口

figure 可以打开一个空的绘图窗口,接下的绘图命令可以将图画在它里面,而不会覆盖以前的绘图窗口。当有多个figure窗口时,在命令窗口中执行如Plot等命令将覆盖当前figure窗口中的对象。所谓的当前figure窗口,也就是最后一次查看的窗口(可以用命令gcf得到)。

figure(N),将编号为N的窗口置为当前figure,出现在所有窗口的最前面,如果该窗口不存在,则新建一个编号为N的空白figure。

3. 注释掉一段程序:%{、%}。

经典方法是用 if 0,但缺点是不够直观,注释掉的内容仍然保持代码的颜色。现在可以用 %和{ 的组合。输入%{后,后面的代码都会变绿,在注释结束的地方再加上 %} 。

也可以选中要注释内容,在右键菜单中选择Comment (Uncomment去掉注释标记),或使用快捷键Ctrl+R。

将光标放在需要注释的行中,按Ctrl+R,将该行变为注释。取消注释也是一样的,快捷键为Ctrl+T。

4. doc 命令名,打开命令的帮助文档

与help命令不同,帮助文档MATLAB Help中对命令的描述更详细,往往还有一些例子,更便于理解。

5. clc 清屏

清除命令窗口中的所有输入和输出信息,不影响命令的历史记录。

6. clear 和clear all

clear 变量名:可以清除workspace中的无用的变量,尤其是一些特别大的矩阵,不用时及时清理,可以减少内存占用。

clear all 清除所有的变量,使workspace一无所有,当重新开始一次算法验证时,最好执行一次,让workspace中的变量一目了然。

7. close all

如果开了多个绘图窗口,用这个命令将它们一起关掉。

8. 上下光标键↑↓

在命令窗口中,上下光标键可以将历史记录中的命令复制到输入位置,便于快速重新执行。如果输入命令的前几个字母如 [row, col] =,再使用光标键,则只会选择以这些字母开始的命令。

9. Tab补全

对名称记得不太清楚的命令,可以输入开头的几个字母,然后按Tab键,当只有一个以这些字母开头的命令时,将自动补全命令名,否则显示一个命令名列表,方便从中选择。当然,只在命令窗口中有效。

10. cell模式

在一个长长的脚本m文件中,可能需要对其中的一段反复修改,查看执行效果,这时,cell模式就非常有用了。cell模式相当于将其中的代码拷贝到命令窗口中运行。两个%后接一个空格(%% )开始一个cell。将输入光标放到一个cell中时,背景将变为浅黄色,Ctrl+Enter执行cell中的代码。

执行cell中代码时不需要保存m文件,该m文件可以不在路径列表中。

cell模式中,断点不起作用,当然,调用的子程序中的断点还是正常的。

11. 获取文件列表,批处理

MATLAB内置了一些文件操作命令,例如cd(切换工作目录),dir(同ls,显示目录内文件列表)等。dir命令可以返回目录中的文件和文件夹列表,存在一个结构体数组中。如果需要对一些数据文件进行批处理,而文件名又没有一定的规律,你可能需要借助于这个命令。

Matlab注释技巧

1. m文件如果是函数,保存的文件名最好与函数名一致,这点都很清楚。不过容易疏忽的是,m文件名的命名尽量不要是简单的英文单词,最好是由大小写英文/数字 /下划线等组成。原因是简单的单词命名容易与matlab内部函数名同名,结果会出现一些莫名其妙的错误。例如,写个m文件,命名为spy,运行时就弹出一个怪怪的figure,呵呵,我当初还以为是什么bug。

2. 调试程序时,经常要屏蔽掉一整段程序进行,也就是将其标示注释符%。有两个办法:一种是选定后 ctrl+r和ctrl+t 一种是在段首加 if 0 ,段尾加 end,中间都不执行,也就相当于注释掉了

3. 写m文件时,选中某段程序内容,ctrl+i 让matlab帮你自动对齐程序。这样程序看起来很有层次,容易发现程序中的错误。

4. ctrl+F2作标签,ctrl+g 跳至某一行,这些快捷键都很实用。

5 matlab7中有块注释符号%{ 和 %}

6 多行加标注时,也可以选中需要添加标注程序,然后在Edit中/或者右键选择Comment。或者Uncomment除掉标注

MATLAB内存管理

用 Matlab 进行大规模科学计算或仿真时,内存是一个需要时常注意的问题。在matlab里运行

>>system_dependent memstats

就可以看到内存的使用状况。当你写的 Matlab 程序跳出“Out of Memory”时,以下几点措施是需要优先考虑的解决方法:

1. 升级内存

2. 升级64位系统

3. 增加虚拟内存

4. 采用3GB开关启动系统

由于32位 Windows 操作系统的限制,每个进程只能使用最多 2GB 的虚拟内存地址空间,因此 Matlab 的可分配内存也受到相应的限制。Matlab 7.0.1 引进了新的内存管理机制,可以利用 Windows 的 3GB 开关,使用 3GB 开关启动的 Windows 每个进程可以在多分配 1 GB 的虚拟地址空间。具体做法是:修改C盘根目录 boot.ini 启动选项加上 /3G,例如:

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /3G

5. 如果必有必要,不要启动java虚拟机,采用matlab -nojvm启动(在快捷方式属性里面的 "..../matlab.exe")改为("...../matlab.exe" - nojvm)

6. 关闭Matlab Server

7. Windows中字体、窗口等都是要占用系统资源的,所以在Matlab运行时尽量不要打开不用的窗口。

除此以外,更关键的是需要弄清楚以下几个问题:

问题一:Matlab是如何存储矩阵的?

Matlab中矩阵是以Block,也就是块的形式存储的。也就是说,当Matlab在为即将存储的矩阵划分块时,如果没有相应大小的连续内存,即使实际内存没有被完全使用,它还是会报告“Out of Memory”。

问题二:如何高效使用Memory?

Matlab 中数组必须占用连续分配的内存段,当无法为新建的数组分配连续的内存段的时候,”Out of Memory”就会出现。在使用的过程中,由于存储单元的不断的被分配和清除,反复分配和释放数组会使内存被分割成不连续的区域,可用的连续内存段减少,很容易造成“Out of Memory”。因此当 Matlab 刚刚启动时其连续内存最多,此时往往可以新建非常大的数组,这一点可以用命令 feature(’memstats’)(在 7.0 版本以上)看出。如果现实的最大连续内存段很小,但实际可用内存(非连续的)仍旧很多,则表明内存中碎片太多了。此时可以考虑用 pack 命令,pack 命令的作用就是将所有内存中的数组写入硬盘,然后重新建立这些数组,以减少内存碎片。此外,在命令行或者程序中都可以使用 clear 命令,随时减少不必要的内存。

因此,治本的方法如下:

1. 在命令行输入 pack 整理内存空间

当内存被分为很多碎片以后,其实本身可能有很大的空间,只是没有作构的连续空间即大的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;‘ ];

eval(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)

7. 为矩阵变量预制内存而不是动态分配

在动态分配的过程中,由于开始Matlab所用的Block随着矩阵的增大而连续的为此矩阵分配内存,但是由于Block的不连续性,很有可能最开始分配的Block不能满足存储的需要,Matlab只好移动此Block以找到更大的Block来存储,这样在移动的过程中不但占用了大量的时间,而且很有可能它找不到更大的块,导致Out of Memory。而当你为矩阵变量预制内存时,Matlab会在计算开始前一次性找到最合适的Block,此时就不用为变量连续的分配内存。比较下面两个程序:

for k = 2:1000

x(k) = x(k-1) + 5;

end

x = zeros(1, 1000);

for k = 2:1000

x(k) = x(k-1) + 5;

end

显然,第二个更好!!!最好的方法是,在程序一开始就位所有大的矩阵变量预制存存储单元!!!

8. 尽量早的为大的矩阵变量预制内存

Matlab使用heap method管理内存。当在Matlab heap中没有足够的内存使用时,它会向系统请求内存。但是只要内存碎片可以存下当前的变量,Matlab会重新使用内存。比如:

a = rand(1e6,1);

b = rand(1e6,1);

使用大约15.4 MB RAM

c = rand(2.1e6,1);

使用近似16.4 MB RAM

a = rand(1e6,1);

b = rand(1e6,1);

clear

c = rand(2.1e6,1);

使用32.4 MB RAM

Matlab不能使用a、b被clear的空间,因为它们均小于2.1 MB,而同时它们也很可能是不连续的。最好的方法:

c = rand(2.1e6,1);

clear

a = rand(1e6,1);

b = rand(1e6,1);

使用16.4 MB RAM

9. 如果可行的话,将一个大的矩阵划分为几个小的矩阵,这样每一次使用的内存减少。

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‘, ‘wt‘);

fprintf(fid, ‘%6.2f %12.8f\n‘, A);

fclose(fid)

save filename.txt A  -format,将数据A以format表示的格式写入filename文本文件中。

实例:  x = 0:.1:1;

A = [x; exp(x)];

save  data.txt A -ASCII

dlmwrite(‘filename.txt‘, A, ‘D‘, R, C),从矩阵A的第R行、第C列开始,使用分隔符D分割数据(“\t”表示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中对数据中的小数就采用浮点数存储,整数就采用整型存储形式。

在使用时,可根据自己实际情况的需要选择适合的一种。个人觉得matlab本身的这种以科学计数法来表示数据,有时不方便于查看。还有一点就是fprintf是按照矩阵列存储。

MATLAB Out of memory问题总结(转载)

首先,我要声明,matlab自带的Help才是最权威的Matlab学习资料,如果有时间好好学习一下或是可以高效的使用的话,一定受益匪浅!比如说像 Out of Memory这个问题,最开始我都是用Help memory,几乎得不到任何信息;然后就是去网上搜索此类问题的解决方法,一般有这几种:

除了升级内存和升级64位系统外,下面几个方法也是解决之道。

# 增加虚拟内存

# 采用PACK (在命令行输入 pack 整理内存空间)

# 采用3GB 开关启动系统(修改 c盘根目录 boot.ini 启动选项加上 /3G 例如:multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /3G

# 优化程序,减少变量(使用稀疏矩阵 sparse ) save 保存变量 load 变量,需要时再读出来

# 如果必有必要,不要启动java虚拟机,采用matlab -nojvm启动(在快捷方式属性里面的 "..../matlab.exe")改为("...../matlab.exe" - nojvm)

#关闭Matlab Server

# 使用单精度 single 短整数替代双精度。

现在看来这些解决方法对于我的问题来说根本就是“治标不治本”,不能解决实际问题,后来在一个师兄的提醒下Help out of memory,终于找到了解决此类问题的方法。在此感谢这位师兄啊!

重申――Matlab的Help才是Matlab的最权威的指导材料!!!

其实我的所谓原创就是对Help out of memory的一些归纳总结而已,有兴趣的话大家可以自己去看!!!

问题一:Matlab是如何存储矩阵的

Matlab中矩阵是以Block,也就是块的形式存储的。也就是说,当Matlab在为即将存储的矩阵划分块时,如果没有相应大小的连续内存,即使实际内存没有被完全使用,他还是会报告“Out of Memory”。

问题二:如何高效使用Memory

由于在使用的过程中,由于存储单元的不断的被分配和清除,内存会被分割成不连续的区域,这是很容易造成“Out of Memory”。

1.

为矩阵变量预制内存而不是动态分配

在动态分配的过程中,由于开始Matlab所用的Block随着矩阵的增大而连续的为此矩阵分配内存,但是由于Block的不连续性,很有可能最开始分配的Block不能满足存储的需要,Matlab只好移动此Block以找到更大的Block 来存储,这样在移动的过程中不但占用了大量的时间,而且很有可能它找不到更大的块,导致Out of Memory。而当你为矩阵变量预制内存时,Matlab会在计算开始前一次性找到最合适的Block,此时就不用为变量连续的分配内存。

比较下面两个程序:

for k = 2:1000

x(k) = x(k-1) + 5;

end

x = zeros(1, 1000);

for k = 2:1000

x(k) = x(k-1) + 5;

end

显然,第二个更好!!!最好的方法是,在程序一开始就位所有大的矩阵变量预制存存储单元!!!

1.

尽量早的分配大的

Matlab使用heap method管理内存。当在Matlab heap中没有足够的内存使用时,它会向请求内存。但是只要内存碎片可以存下当前的变量,Matlab会重新使用内存。

比如:

a = rand(1e6,1);

b = rand(1e6,1);

使用大约15.4 MB RAM

c = rand(2.1e6,1);使用近似16.4 MB RAM:

a = rand(1e6,1);

b = rand(1e6,1);

clear

c = rand(2.1e6,1);

使用32.4 MB RAM。因为Matlab不能使用a、b被clear的空间,因为它们均小于2.1 MB,而同时它们也很可能是不连续的。

最好的方法:

c = rand(2.1e6,1);

clear

a = rand(1e6,1);

b = rand(1e6,1);

使用16.4 MB RAM

2.

尽量避免产生大的瞬时变量,当它们不用的时候应该及时clear。

3.

尽量的重复使用变量(跟不用的clear掉一个意思)

4.

将矩阵转化成稀疏形式

如果矩阵中有大量的0,最好存储成稀疏形式。稀疏形式的矩阵使用内存更少,执行时间更短。

例如:

1000×1000的矩阵X,它2/3的为0,使用两种存储方法的比较:

Name

Size

Bytes

Class

X

1000x1000

8000000

double array

Y

1000x1000

4004000

double array (sparse)

5.

使用pack

当内存被分为很多碎片以后,其实本身可能有很大的空间,只是没有作构的连续空间即大的Block而已。如果此时Out of Memory,此时使用pack命令可以很好的解决此问题。

6.

如果可行的话,将一个大的矩阵划分为几个小的矩阵,这样每一次使用的内存减少。

7.

增大内存

问题三: Increase the size of the swap file.

wap space的与使用的操作系统有关,具体的如下:

1.

UNIX

Information about swap space can be procured by typing pstat -s at the UNIX command prompt. For detailed information on changing swap space, ask your system administrator.

2.

Linux

Swap space can be changed by using the mkswap and swapon commands. For more information on the above commands, type man followed by the command name at the Linux prompt.

3.

Windows NT

Follow the steps shown here: Right-click the My Computer icon, and select Properties. Select the Performance tab and click the Change button to change the amount of virtual memory.

4.

Windows 2000

右键“我的电脑”->属性->高级->性能->设置,从而改变其虚拟内存。

5.

Windows XP

右键“我的电脑”->属性->高级->性能->设置,从而改变其虚拟内存。

问题四:尽量少时用系统资源(对于Windows)

Windows中字体、窗口等都是要占用系统资源的,所以在Matlab时尽量不要打开不用的窗口。

问题五:Reloading Variables on UNIX Systems

由于我不使用UNIX系统,这里不介绍,直接从Help中粘过来

On UNIX systems, MATLAB does not return memory to the operating system even after variables have been cleared. This is due to the manner in which UNIX manages memory. UNIX does not accept memory back from a program until the program has terminated. So, the amount of memory used in a MATLAB session is not returned to the operating system until you exit MATLAB.

To free up the memory used in your MATLAB session, save your workspace variables, exit MATLAB, and then load your variables back in.

时间: 2024-10-12 03:14:01

[转载]Matlab实用小技巧——Matlab学习笔记的相关文章

VC6.0实用小技巧

VC6.0的若干实用小技巧 1.检测程序中的括号是否匹配 把光标移动到需要检测的括号(如大括号{}.方括号[].圆括号()和尖括号<>)前面,键入快捷键 “Ctrl+]”.如果括号匹配正确,光标就跳到匹配的括号处,否则光标不移动,并且机箱喇叭还会发出一 声警告声. 2.查看一个宏(或变量.函数)的宏定义 把光标移动到你想知道的一个宏上,就比如说最常见的DECLARE_MAP_MESSAGE上按一下F12(或右键 菜单中的Go To Defition Of …),如果没有建立Browse fil

实用小技巧1

把windows电脑变成路由器使用 适用对象: windows7.windows8的笔记本电脑或者有无线网卡的台式电脑 网络要求: CMCC-EDU和家里拨号上网的都可以,但是电信的校园有线不行 步骤如下: 1.在开始菜单里搜索cmd,找到后以管理员身份运行 2.在cmd命令行上输入以下命令: netsh wlan set hostednetwork mode=allow ssid=你所共享的无线的名字(最好是英文或者是拼音) key=密码 回车 这一步主要是设置你的“路由器” 3.下一步是开启

微信小程序,学习笔记(一)框架,视图层

微信小程序,学习笔记(一)框架,视图层 学习链接:http://www.w3cschool.cn/weixinapp/ 因为其实并非原创,但是并没有什么好的类别可选,所以修改成:"翻译"了. 熟悉 文档结构介绍 --- [D] pages --- [D] utils --- [F] app.js --- [F] app.json --- [F] app.wxss 全局变量.对象.方法 普通类型 对象 App 应用程序全局实例,在app.js中定义,每个程序只有一个实例,可以通过如下方式

VC的若干实用小技巧 (如何干净的删除一个类)

Visual C++6.0(5.0)开发工具功能非常强大,但是对于初学者来说,却有很多细节的问题需要注意.作者搜集整理了以下一些实用小技巧,希望对初学者有所帮助. 1:使用vc开发项目时,常会遇到这种情况:      即明明只改动了一个文件,却要把整个项目全部重新编译连接一次.刚刚连接好,一运行,又提示重新编译连接一次,非常讨厌.这是因为出现了未来文件的缘故.      解决方法:      找出对应文件夹下的debug目录,将未来文件全部delete, 再rebuild all一次.(未来 文

大端模式 && 小端模式学习笔记

Big-Endian和Little-Endian的定义如下:1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端.2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端. 不同字节序如何存储数据? 看看两种方式如何存储数据,假设从地址0x00000001处开始存储十六进制数0x12345678,那么 Bit-endian 如此存放(按原来顺序存储)0x00000001           -- 120x00000002 

必看!macOS进阶不得不知的实用小技巧

不知道大家对使用苹果电脑的体验如何?您充分利用您的mac了吗?其实macOS上存在着许多快捷方式和技巧可以帮助简化我们的工作流程,提高效率,但是在日常生活中经常被人们忽略或者遗忘.以下是macdown小编整理的一些macOS实用小技巧,希望能够帮助大家更好地使用苹果电脑. 桌面和应用程序管理 激活聚焦搜索 如果想在第一时间唤出聚焦搜索的话,你可以使用[Command + 空格].聚焦搜索可以找到任何位于电脑中广泛项目,包含文件.图片.音乐.应用程式.系统喜好设定控制台,也可以是文件或是PDF中指

UI设计的实用小技巧

本文和大家分享的主要是ui设计中的一些小技巧,一起来看看吧,希望对大家学习ui设计有所帮助. 一.每个设计都能实到其它终端目标: 每一个用户界面都应该建立在以实现一个端目标. 比如,iPhone的拍照摄像设计,使其尽可能容易拍照:而像Facebook,是为了使聊天和分享尽可能一样容易. 从导航到Web表单,用户界面的各方面,应建立以实现您的应用程序目标 ,无论是执行一个函数或者发现新的东西 ,尽可能简单,为用户实现. 二.把一切尽可能简单 当涉及到用户界面设计,简单是成功的关键.复杂的接口属于企

【转载】Cocos2dx 小技巧(十四)ScrollView实现缩放效果

Cocos2dx 小技巧(十四)ScrollView实现缩放效果 这阶段心绪比较乱,所以这篇开头就不扯淡了.(谁说大姨夫来了我跟谁急!~~)说到大姨夫我突然想到英雄联盟有个美女解说叫伊芙蕾亚,她的堂弟ID竟然叫:姨夫累呀,好笑吧(呵呵,有点冷~~额,我都说不扯淡了). ------------前天有个网友问我一些关于scrollView的用法,由于在QQ上实在讲不清,所以就利用晚上的时间写这篇博客出来了.本篇要实现的功能是用scrollView 拖动对象时,对象移动到某个固定范围会有放大.缩小的

Maven在Eclipse中的实用小技巧

前言 我们在开发的工程中很多都是Maven项目,这样更加便于我们jar包的管理.而我们一般使用的IDE都是Eclipse,由于我们在日常的开发过程中会经常要用到一些Maven的操作,所以我今天主要跟大家分享一下我们在日常开发中的Maven实用小知识,让大家不再云里雾里. 安装配置Maven 1.安装Maven,下载一个maven包解压,然后配置maven环境变量(配置完成后在dos窗口用mvn命令测试下). 2.在Eclipse中安装Maven插件,Maven插件在线安装地址为:http://m