Matlab 编程技巧
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中的一些小技巧
1. Ctrl+C 中断正在执行的操作
如果程序不小心进入死循环,或者计算时间太长,可以在命令窗口中使用Ctrl+c来中断。MATLAB这时可能正疲于应付,响应会有些滞后。
如果程序不小心进入死循环,或者计算时间太长,可以在命令窗口中使用Ctrl+c来中断。MATLAB这时可能正疲于应付,响应会有些滞后。
2. figure命令新建一个绘图窗口
figure 可以打开一个空的绘图窗口,接下的绘图命令可以将图画在它里面,而不会覆盖以前的绘图窗口。当有多个figure窗口时,在命令窗口中执行如Plot等命令将覆盖当前figure窗口中的对象。所谓的当前figure窗口,也就是最后一次查看的窗口(可以用命令gcf得到)。
figure(N),将编号为N的窗口置为当前figure,出现在所有窗口的最前面,如果该窗口不存在,则新建一个编号为N的空白figure。
figure(N),将编号为N的窗口置为当前figure,出现在所有窗口的最前面,如果该窗口不存在,则新建一个编号为N的空白figure。
3. 注释掉一段程序:%{、%}。
经典方法是用 if 0,但缺点是不够直观,注释掉的内容仍然保持代码的颜。现在可以用 %和{ 的组合。输入%{后,后面的代码都会变绿,在注释结束的地方再加上 %} 。
也可以选中要注释内容,在右键菜单中选择Comment (Uncomment去掉注释标记),或使用快捷键Ctrl+R。
将光标放在需要注释的行中,按Ctrl+R,将该行变为注释。取消注释也是一样的,快捷键为Ctrl+T。
经典方法是用 if 0,但缺点是不够直观,注释掉的内容仍然保持代码的颜。现在可以用 %和{ 的组合。输入%{后,后面的代码都会变绿,在注释结束的地方再加上 %} 。
也可以选中要注释内容,在右键菜单中选择Comment (Uncomment去掉注释标记),或使用快捷键Ctrl+R。
将光标放在需要注释的行中,按Ctrl+R,将该行变为注释。取消注释也是一样的,快捷键为Ctrl+T。
4. doc 命令名,打开命令的帮助文档
与help命令不同,帮助文档MATLAB Help中对命令的描述更详细,往往还有一些例子,更便于理解。
与help命令不同,帮助文档MATLAB Help中对命令的描述更详细,往往还有一些例子,更便于理解。
5. clc 清屏
清除命令窗口中的所有输入和输出信息,不影响命令的历史记录。
清除命令窗口中的所有输入和输出信息,不影响命令的历史记录。
6. clear 和clear all
clear 变量名:可以清除workspace中的无用的变量,尤其是一些特别大的矩阵,不用时及时清理,可以减少内存占用。
clear all 清除所有的变量,使workspace一无所有,当重新开始一次算法验证时,最好执行一次,让workspace中的变量一目了然。
clear 变量名:可以清除workspace中的无用的变量,尤其是一些特别大的矩阵,不用时及时清理,可以减少内存占用。
clear all 清除所有的变量,使workspace一无所有,当重新开始一次算法验证时,最好执行一次,让workspace中的变量一目了然。
7. close all
如果开了多个绘图窗口,用这个命令将它们一起关掉。
如果开了多个绘图窗口,用这个命令将它们一起关掉。
8. 上下光标键↑↓
在命令窗口中,上下光标键可以将历史记录中的命令复制到输入位置,便于快速重新执行。如果输入命令的前几个字母如 [row, col] =,再使用光标键,则只会选择以这些字母开始的命令。
在命令窗口中,上下光标键可以将历史记录中的命令复制到输入位置,便于快速重新执行。如果输入命令的前几个字母如 [row, col] =,再使用光标键,则只会选择以这些字母开始的命令。
9. Tab补全
对名称记得不太清楚的命令,可以输入开头的几个字母,然后按Tab键,当只有一个以这些字母开头的命令时,将自动补全命令名,否则显示一个命令名列表,方便从中选择。当然,只在命令窗口中有效。
对名称记得不太清楚的命令,可以输入开头的几个字母,然后按Tab键,当只有一个以这些字母开头的命令时,将自动补全命令名,否则显示一个命令名列表,方便从中选择。当然,只在命令窗口中有效。
10. cell模式
在一个长长的脚本m文件中,可能需要对其中的一段反复修改,查看执行效果,这时,cell模式就非常有用了。cell模式相当于将其中的代码拷贝到命令窗口中运行。两个%后接一个空格(%% )开始一个cell。将输入光标放到一个cell中时,背景将变为浅黄,Ctrl+Enter执行cell中的代码。
执行cell中代码时不需要保存m文件,该m文件可以不在路径列表中。
cell模式中,断点不起作用,当然,调用的子程序中的断点还是正常的。
在一个长长的脚本m文件中,可能需要对其中的一段反复修改,查看执行效果,这时,cell模式就非常有用了。cell模式相当于将其中的代码拷贝到命令窗口中运行。两个%后接一个空格(%% )开始一个cell。将输入光标放到一个cell中时,背景将变为浅黄,Ctrl+Enter执行cell中的代码。
执行cell中代码时不需要保存m文件,该m文件可以不在路径列表中。
cell模式中,断点不起作用,当然,调用的子程序中的断点还是正常的。
11. 获取文件列表,批处理
MATLAB内置了一些文件操作命令, 例如cd(切换工作目录),dir(同ls,显示目录内文件列表)等。dir命令可以返回目录中的文件和文件夹列表,存在一个结构体数组中。如果需要对一些数据文件进行批处理,而文件名又没有一定的规律,你可能需要借助于这个命令。
MATLAB内置了一些文件操作命令, 例如cd(切换工作目录),dir(同ls,显示目录内文件列表)等。dir命令可以返回目录中的文件和文件夹列表,存在一个结构体数组中。如果需要对一些数据文件进行批处理,而文件名又没有一定的规律,你可能需要借助于这个命令。
这里是几个Matlab的小提示,基本上是我使用Matlab时碰到并解决了的问题,希望能使别人不要再碰钉子走弯路了。如果有建议或发现其中有错误,请与我联系。Kotaimen.Cao, kotaimen_c@citiz
1、循环变量
由于历史的原因,程序员们总是使用i,j,…为循环变量命名,但是在Matlab中这种习惯可能会导致一些很隐蔽的问题。因为i,j同时也是Matlab中的虚数单位,如果你给i赋值,就会覆盖掉原来虚数单位的定义,例如:
4+i*3
ans =
4.0000 + 3.0000i
for i=1:10, end
1、循环变量
由于历史的原因,程序员们总是使用i,j,…为循环变量命名,但是在Matlab中这种习惯可能会导致一些很隐蔽的问题。因为i,j同时也是Matlab中的虚数单位,如果你给i赋值,就会覆盖掉原来虚数单位的定义,例如:
4+i*3
ans =
4.0000 + 3.0000i
for i=1:10, end
4+i*3
ans =
34
在一段很长的程序中很难发现这个错误,因此不要用i,j作循环变量名,除非你确认在代码的作用域内不会和复数打交道;或者使用4+3i这样的复数记法;也可以换用j:
for i=1:10, end
i
i =
10
j
ans =
0 + 1.0000i
ans =
34
在一段很长的程序中很难发现这个错误,因此不要用i,j作循环变量名,除非你确认在代码的作用域内不会和复数打交道;或者使用4+3i这样的复数记法;也可以换用j:
for i=1:10, end
i
i =
10
j
ans =
0 + 1.0000i
1i
ans =
0 + 1.0000i
4+3i
ans =
4.0000 + 3.0000i
2、循环
我经常看到一些Matlab初学者写出带有层层循环的代码,这些代码往往运行得很慢,而且非常难懂。Matlab提供了大量的命令来避免循环,我的建议是:在确定要写一个针对矩阵操作的2重循环之前,请仔细阅读帮助中的Maximizing MATLAB Performance一节。里面有很多例子,这里举一个我自己碰到的问题。
ans =
0 + 1.0000i
4+3i
ans =
4.0000 + 3.0000i
2、循环
我经常看到一些Matlab初学者写出带有层层循环的代码,这些代码往往运行得很慢,而且非常难懂。Matlab提供了大量的命令来避免循环,我的建议是:在确定要写一个针对矩阵操作的2重循环之前,请仔细阅读帮助中的Maximizing MATLAB Performance一节。里面有很多例子,这里举一个我自己碰到的问题。
要统计数字图像的亮度最大值和最小值,由于数字图像可能是一个二维或三维的矩阵,开始我写出了如下的代码:
switch ndims(img)
case 2
m = max(max(img));
case 3
m = max(max(max(img)));
end
后来我对这种做法很不满意,如果有一个8维的矩阵,难道我要写
max(max(max(max(max(max(max(max(x))))))))
才行?后来我发现无论矩阵是什么维数,实际上
max( x( : ) )就够了。
3、符号运算
switch ndims(img)
case 2
m = max(max(img));
case 3
m = max(max(max(img)));
end
后来我对这种做法很不满意,如果有一个8维的矩阵,难道我要写
max(max(max(max(max(max(max(max(x))))))))
才行?后来我发现无论矩阵是什么维数,实际上
max( x( : ) )就够了。
3、符号运算
许多Matlab函数(特别是数值计算方面的)可以作为函数句柄(function handle)或内联对象(inline object)作为参数。我们以quad函数为例,这个函数使用Simpson算法求函数的数值积分。它的一种调用形式是:
quad(fun, a, b)
其中,fun可以是指向被积函数的函数句柄,或者含有被积函数的内联对象;a和b分别是被积区间的上、下限。考虑以下积分:
使用函数句柄的方法:
% 将下面到"% EOF"的代码保存为f.m
function y = f(x)
y = sin(x) ./ x;
% EOF
quad(@f, 1, 2)
ans =
0.6593
使用内联对象的方法:
quad( inline( 'sin(x)./x' )), 1, 2 )
ans =
0.6593
由于使用内联对象不需要另外建立m文件,所以比较方便,建议使用这种方法。
更加常见的应用是被积函数有不确定的参数,例如:
其中参数a,b,K运行时确定,这时,使用函数句柄将显得很麻烦,可以用以下的方法:
a = rand;
b = rand + 1;
K = rand;
y = subs('sin(K*x)/x', 'K', sym(K, 'd') )
quad( inline(vectorize(char(y))), a, b)
y =
sin(.79193703742703536185842949635116*x)/x
ans =
0.8188
其中参数a,b,K运行时确定,这时,使用函数句柄将显得很麻烦,可以用以下的方法:
a = rand;
b = rand + 1;
K = rand;
y = subs('sin(K*x)/x', 'K', sym(K, 'd') )
quad( inline(vectorize(char(y))), a, b)
y =
sin(.79193703742703536185842949635116*x)/x
ans =
0.8188
当然,由于a,b,K是随机数,结果是不确定的。
这里有有两点需要说明:
第一,请注意sym(K, 'd'),如果直接使用subs('sin(K*x)/x, 'K', K)或subs('sin(K*x)/x, 'K', sym(K))的话,高版本的符号工具箱会将K尽可能化为分数,有时这是十分恐怖的,也许会得到:
sin(6649179754310225/9007199254740992*x)/x
这样的结果。
第二,注意vectorize函数。sym对象重载的char函数会把数组的乘除(.*, ./, .^)化成矩阵的乘除(*, /, ^),vectorize会将字符串里的*,/,^全化成.*, ./, .^,如果不这样做,quad函数将会出错,这个问题曾经困扰了我很长的时间:
quad( inline(char(y)), a, b)
这里有有两点需要说明:
第一,请注意sym(K, 'd'),如果直接使用subs('sin(K*x)/x, 'K', K)或subs('sin(K*x)/x, 'K', sym(K))的话,高版本的符号工具箱会将K尽可能化为分数,有时这是十分恐怖的,也许会得到:
sin(6649179754310225/9007199254740992*x)/x
这样的结果。
第二,注意vectorize函数。sym对象重载的char函数会把数组的乘除(.*, ./, .^)化成矩阵的乘除(*, /, ^),vectorize会将字符串里的*,/,^全化成.*, ./, .^,如果不这样做,quad函数将会出错,这个问题曾经困扰了我很长的时间:
quad( inline(char(y)), a, b)
??? Index exceeds matrix dimensions.
Error in ==> D:\MATLAB6p5\toolbox\matlab\funfun\quad.m
On line 67 ==> if ~isfinite(y(7))
3、隐藏的图形对象属性
Matlab的所谓句柄图形(handle graphics)对象的配置是通过许多属性的设置来完成的。有一些帮助文件中没有提到的确实存在的属性。
figure的Toolbar属性
有三个值:'none', 'auto', 'figure'
利用这个属性可以把figure变成没有菜单条却有工具栏的样式:
figure('Menubar', 'none', 'Toolbar', 'figure')
root object的Default属性
在我的Malab环境里,Root object有如下的默认值:
get(0, 'Default')
ans =
defaultFigurePosition: [232 258 560 420]
defaultTextColor: [0 0 0]
defaultAxesXColor: [0 0 0]
defaultAxesYColor: [0 0 0]
defaultAxesZColor: [0 0 0]
defaultPatchFaceColor: [0 0 0]
defaultPatchEdgeColor: [0 0 0]
defaultLineColor: [0 0 0]
defaultFigureInvertHardcopy: 'on'
defaultFigureColor: [0.8000 0.8000 0.8000]
defaultAxesColor: [1 1 1]
get(0, 'Default')
ans =
defaultFigurePosition: [232 258 560 420]
defaultTextColor: [0 0 0]
defaultAxesXColor: [0 0 0]
defaultAxesYColor: [0 0 0]
defaultAxesZColor: [0 0 0]
defaultPatchFaceColor: [0 0 0]
defaultPatchEdgeColor: [0 0 0]
defaultLineColor: [0 0 0]
defaultFigureInvertHardcopy: 'on'
defaultFigureColor: [0.8000 0.8000 0.8000]
defaultAxesColor: [1 1 1]
defaultAxesColorOrder: [7x3 double]
defaultFigureColormap: [64x3 double]
defaultSurfaceEdgeColor: [0 0 0]
defaultFigurePaperType: 'A4'
defaultFigurePaperUnits: 'centimeters'
实际上,还有一些默认值不会被显示出来:
get(0, 'defaultUicontrolBackgroundColor')
get(0, 'defaultUicontrolForegroundColor')
get(0, 'defaultUicontrolFontName')
get(0, 'defaultUicontrolFontSize')
get(0, 'defaultUicontrolFontWeight')
get(0, 'defaultUicontrolFontAngle')
ans =
defaultFigureColormap: [64x3 double]
defaultSurfaceEdgeColor: [0 0 0]
defaultFigurePaperType: 'A4'
defaultFigurePaperUnits: 'centimeters'
实际上,还有一些默认值不会被显示出来:
get(0, 'defaultUicontrolBackgroundColor')
get(0, 'defaultUicontrolForegroundColor')
get(0, 'defaultUicontrolFontName')
get(0, 'defaultUicontrolFontSize')
get(0, 'defaultUicontrolFontWeight')
get(0, 'defaultUicontrolFontAngle')
ans =
0.7725 0.7961 0.8118
0 0 0
ans =
MS Sans Serif
ans =
8
ans =
normal
ans =
normal
\
这些默认值有助于在创建用户界面时遵循操作系统颜,例如:
\
0 0 0
ans =
MS Sans Serif
ans =
8
ans =
normal
ans =
normal
\
这些默认值有助于在创建用户界面时遵循操作系统颜,例如:
\
figure('Color', get(0,'defaultUicontrolBackgroundColor'))
system_dependent('getdata')
system_dependent('getwinsys')
版本
使用version函数可以获得Matlab或工具箱的版本:
v1 = ver('matlab')
v1 =
Name: 'MATLAB'
Version: '6.5'
Release: '(R13)'
Date: '20-Jun-2002'
v2 = ver('control')
system_dependent('getdata')
system_dependent('getwinsys')
版本
使用version函数可以获得Matlab或工具箱的版本:
v1 = ver('matlab')
v1 =
Name: 'MATLAB'
Version: '6.5'
Release: '(R13)'
Date: '20-Jun-2002'
v2 = ver('control')
v2 =
Name: 'Control System Toolbox'
fontweight默认值 Version: '5.2'
Release: '(R13)'
Date: '28-Jun-2002'
如果工具箱不存在或没有安装返回空结构
v3 = ver('nonsense')
v3 =
0x0 struct array with fields:
Name
Version
Release
Name: 'Control System Toolbox'
fontweight默认值 Version: '5.2'
Release: '(R13)'
Date: '28-Jun-2002'
如果工具箱不存在或没有安装返回空结构
v3 = ver('nonsense')
v3 =
0x0 struct array with fields:
Name
Version
Release
Date
可以利用这个函数让自己的程序在不当的Matlab版本上运行时给出比较体面的警告。另外,有一个帮助中没有提及的内部函数system_dependent可以获得操作系统的版本:
system_dependent('getos')
ans =
Microsoft Windows XP
system_dependent('getwinsys')
ans =
Version 5.1 (Build 2600)
uitools工具集
可以利用这个函数让自己的程序在不当的Matlab版本上运行时给出比较体面的警告。另外,有一个帮助中没有提及的内部函数system_dependent可以获得操作系统的版本:
system_dependent('getos')
ans =
Microsoft Windows XP
system_dependent('getwinsys')
ans =
Version 5.1 (Build 2600)
uitools工具集
除了帮助中提及的一些GUI工具函数外,matlabroot\toolbox\matlab\uitools里还有不少帮助里没有提及的函数,建议仔细研究一下(help uitools),例如,makemenu函数可以从字符串中生成菜单:
labels = str2mat( ...
'&File', ...
'>&New^n', ...
'>&Open', ...
'>>Open &document^d', ...
'>>Open &graph^g', ...
'>-------', ...
'>&Save^s', ...
'&Edit', ...
'&View', ...
'>&Axis^a', ...
'>&Selection region^r' ...
labels = str2mat( ...
'&File', ...
'>&New^n', ...
'>&Open', ...
'>>Open &document^d', ...
'>>Open &graph^g', ...
'>-------', ...
'>&Save^s', ...
'&Edit', ...
'&View', ...
'>&Axis^a', ...
'>&Selection region^r' ...
);
calls = str2mat( ...
'', ...
'disp(''New'')', ...
'', ...
'disp(''Open doc'')', ...
'disp(''Open graph'')', ...
'', ...
'disp(''Save'')', ...
'', ...
'', ...
'disp(''View axis'')', ...
'disp(''View selection region'')' ...
);
calls = str2mat( ...
'', ...
'disp(''New'')', ...
'', ...
'disp(''Open doc'')', ...
'disp(''Open graph'')', ...
'', ...
'disp(''Save'')', ...
'', ...
'', ...
'disp(''View axis'')', ...
'disp(''View selection region'')' ...
);
handles = makemenu( figure('Menubar', 'none'), labels, calls);
本文为转载,技巧虽小,但是很实用。特此转帖,给自己一个学习的机会,也让大家分享。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论