matlab编程技巧2.docx
- 文档编号:3903851
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:10
- 大小:19.99KB
matlab编程技巧2.docx
《matlab编程技巧2.docx》由会员分享,可在线阅读,更多相关《matlab编程技巧2.docx(10页珍藏版)》请在冰豆网上搜索。
matlab编程技巧2
1.m文件如果是函数,保存的文件名最好与函数名一致,这点都很清楚。
不过容易疏忽的是,m文件名的命名尽量不要是简单的英文单词,最好是由大小写英文/数字/下划线等组成。
原因是简单的单词命名容易与matlab内部函数名同名,结果会出现一些莫名其妙的错误。
例如,写个m文件,命名为spy,运行时就弹出一个怪怪的figure,呵呵,我当初还以为是什么bug。
2.调试程序时,经常要屏蔽掉一整段程序进行,也就是将其标示注释符%。
有两个办法:
一种是选定后ctrl+r和ctrl+t一种是在段首加if0,段尾加end,中间都不执行,也就相当于注释掉了
3.写m文件时,选中某段程序内容,ctrl+i让matlab帮你自动对齐程序。
这样程序看起来很有层次,容易发现程序中的错误。
4.还有,ctrl+F2作标签,ctrl+g跳至某一行,这些快捷键都很实用。
matlab7中有块注释符号%{和%}
在下补充一句:
多行加标注时,也可以选中需要添加标注程序,然后在Edit中选择Comment。
或者Uncomment除掉标注!
这里是几个Matlab的小提示,基本上是我使用Matlab时碰到并解决了的问题,希望能使别人不要再碰钉子走弯路了。
[size=3][color=red]循环变量[/color][/size]
由于历史的原因,程序员们总是使用i,j,…为循环变量命名,但是在Matlab中这种习惯可能会导致一些很隐蔽的问题。
因为i,j同时也是Matlab中的虚数单位,如果你给i赋值,就会覆盖掉原来虚数单位的定义,例如:
4+i*3
ans=
4.0000+3.0000i
fori=1:
10,end
4+i*3
ans=
34
在一段很长的程序中很难发现这个错误,因此不要用i,j作循环变量名,除非你确认在代码的作用域内不会和复数打交道;或者使用4+3i这样的复数记法;也可以换用j:
fori=1:
10,end
i
i=
10
j
ans=
0+1.0000i
1i
ans=
0+1.0000i
4+3i
ans=
4.0000+3.0000i
[size=3][color=red]循环[/color][/size]
我经常看到一些Matlab初学者写出带有层层循环的代码,这些代码往往运行得很慢,而且非常难懂。
Matlab提供了大量的命令来避免循环,我的建议是:
在确定要写一个针对矩阵操作的2重循环之前,请仔细阅读帮助中的MaximizingMATLABPerformance一节。
里面有很多例子,这里举一个我自己碰到的问题。
要统计数字图像的亮度最大值和最小值,由于数字图像可能是一个二维或三维的矩阵,开始我写出了如下的代码:
switchndims(img)
case2
m=max(max(img));
case3
m=max(max(max(img)));
end
后来我对这种做法很不满意,如果有一个8维的矩阵,难道我要写
max(max(max(max(max(max(max(max(x))))))))
才行?
后来我发现无论矩阵是什么维数,实际上
max(x(:
))
就够了。
[size=3][color=red]符号运算[/color][/size]
许多Matlab函数(特别是数值计算方面的)可以函数句柄(functionhandle)或内联对象(inlineobject)作为参数。
我们以q?
函数为例,这个函数使用Simpson算法求函数的数值积分。
它的一种调用形式是:
q?
(fun,a,b)
其中,fun可以是指向被积函数的函数句柄,或者含有被积函数的内联对象;a和b分别是被积区间的上、下限。
考虑以下积分:
使用函数句柄的方法:
%将下面到"%EOF"的代码保存为f.m
functiony=f(x)
y=sin(x)./x;
%EOF
q?
(@f,1,2)
ans=
0.6593
使用内联对象的方法:
q?
(inline( 'sin(x)./x' )),1,2 )
ans=
0.6593
由于使用内联对象不需要另外建立m文件,所以比较方便,建议使用这种方法。
更加常见的应用是被积函数有不确定的参数,例如:
其中参数a,b,K运行时确定,这时,使用函数句柄将显得很麻烦,可以用以下的方法:
a=rand;
b=rand+1;
K=rand;
y=s
s('sin(K*x)/x','K',sym(K,'d'))
q?
(inline(vectorize(char(y))),a,b)
y=
sin(.79193703742703536185842949635116*x)/x
ans=
0.8188
当然,由于a,b,K是随机数,结果是不确定的。
这里有两点需要说明:
第一,请注意sym(K,'d'),如果直接使用s
s('sin(K*x)/x,'K',K)或s
s('sin(K*x)/x,'K',sym(K))的话,高版本的符号工具箱会将K尽可能化为分数,有时这是十分恐怖的,也许会得到:
sin(6649179754310225/9007199254740992*x)/x
这样的结果。
[[i]本帖最后由eight于2007-4-612:
47编辑[/i]]
2005-9-523:
21ik760218
第二,注意vectorize函数。
sym对象重载的char函数会把数组的乘除(.*,./,.^)化成矩阵的乘除(*,/,^),vectorize会将字符串里的*,/,^全化成.*,./,.^,如果不这样做,q?
函数将会出错,这个问题曾经困扰了我很长的时间:
q?
(inline(char(y)),a,b)
?
?
?
Indexexceedsmatrixdimensions.
Errorin==>D:
\MATLAB6p5\toolbox\matlab\funfun\q?
.m
Online67 ==>if~isfinite(y(7))
[size=3][color=red]隐藏的图形对象属性
[/color][/size]
Matlab的所谓句柄图形(handlegraphics)对象的配置是通过许多属性的设置来完成的。
有一些帮助文件中没有提到的确实存在的属性。
[color=bl
]figure的Toolbar属性
[/color]
有三个值:
'none','auto','figure'
利用这个属性可以把figure变成没有菜单条却有工具栏的样式:
figure('Men
ar','none','Toolbar','figure')
[color=bl
]rootobject的Default属性[/color]
在我的Malab环境里,Rootobject有如下的默认值:
get(0,'Default')
ans=
defaultFigurePosition:
[232258560420]
defaultTextColor:
[000]
defaultAxesXColor:
[000]
defaultAxesYColor:
[000]
defaultAxesZColor:
[000]
defaultPatchFaceColor:
[000]
defaultPatchEdgeColor:
[000]
defaultLineColor:
[000]
defaultFigureInvertHardcopy:
'on'
defaultFigureColor:
[0.80000.80000.8000]
defaultAxesColor:
[111]
defaultAxesColorOrder:
[7x3do
le]
defaultFigureColormap:
[64x3do
le]
defaultSurfaceEdgeColor:
[000]
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
ans=
0 0 0
ans=
MSSansSerif
ans=
8
ans=
normal
ans=
normal
这些默认值有助于在创建用户界面时遵循操作系统颜色,例如:
figure('Color',get(0,'defaultUicontrolBackgroundColor'))
system_dependent('getdata')
system_dependent('getwinsys')
[color=bl
]版本
[/color]
使用version函数可以获得Matlab或工具箱的版本:
v1=ver('matlab')
v1=
Name:
'MATLAB'
Version:
'6.5'
Release:
'(R13)'
Date:
'20-Jun-2002'
v2=ver('control')
v2=
Name:
'ControlSystemToolbox'
Version:
'5.2'
Release:
'(R13)'
Date:
'28-Jun-2002'
如果工具箱不存在或没有安装返回空结构
v3=ver('nonsense')
v3=
0x0str
tarraywithfields:
Name
Version
Release
Date
可以利用这个函数让自己的程序在不当的Matlab版本上运行时给出比较体面的警告。
另外,有一个帮助中没有提及的内部函数system_dependent可以获得操作系统的版本:
system_dependent('getos')
ans=
MicrosoftWindowsXP
system_dependent('getwinsys')
ans=
Version5.1(Build2600)
[color=bl
]uitools工具集[/color]
除了帮助中提及的一些GUI工具函数外,matlabroot\toolbox\matlab\uitools里还有不少帮助里没有提及的函数,建议仔细研究一下(helpuitools),例如,makemenu函数可以从字符串中生成菜单:
labels=str2mat(...
'&File',...
'>&New^n',...
'>&Open',...
'>>Open&document^d',...
'>>Open&graph^g',...
'>-------',...
'>&Save^s',...
'&Edit',...
'&View',...
'>&Axis^a',...
'>&Selectionregion^r'...
);
calls=str2mat(...
'',...
'disp(''New'')',...
'',...
'disp(''Opendoc'')',...
'disp(''Opengraph'')',...
'',...
'disp(''Save'')',...
'',...
'',...
'disp(''Viewaxis'')',...
'disp(''Viewselectionregion'')'...
);
handles=makemenu(figure('Men
ar','none'),labels,calls);
连续函数加:
'',例如:
y='sin(x)'
画连续函数:
ezplot(y)
画子图:
s
plot(321),plot(y) 或者:
s
plot(10,12,7),plot(y)
加噪:
y=sin(x)+0.03*randn(size(x))
去噪:
[a,d]=dwt(y,'db1')
y2=idwt(a,[],'db1') 若噪声较大,则可多次去噪
帮助:
help_dwt2 (注:
中间是空格键)
平移奇数个:
不能检测断点
以下是自己在最近工作中用到的几条小技巧:
1.在用循环画很多图时,为了减少对内存的占用,可以设置图像不显示,直接保存起来。
其实也很简单,就是在plot等语句前加上一句:
figure('visible','off')。
这样画图时就不显示了!
2.记得很久以前就有这种想法:
如果一下画很多图,一张张手工存,岂不很累?
!
也很傻吧!
^_^Matlab应该有可以直接存储图像的命令!
抑或是同样归因于自己的懒惰,也抑或是实际的工作还没有真正逼着自己想办法解决,直到上次Lozovatsky来才真正实现!
老拉的一句话给了我很大的刺激:
WhynotaskMatlab?
!
是呀,最好的参考资料不就是它自身的Help嘛!
其实,也很简单,也让我再次折服于Matlab的通俗性,不就是相应英文单词的组合嘛!
saveas(gcf,filename,'emf')看到后自己都有点哭笑不得!
:
(
3.对于时间的标注,datanum与datetick这两个命令很好用!
4.Matlab可不可以建文件夹?
!
一直以为它不可以,每次都是乖乖地建好,再让它慢慢往里存数据。
其实不然,是我们小瞧了它!
在Matlab里可以通过system这个命令调出dos命令,比如:
执行语句system('mkdirstep1')就可以在当前目录下建立名为”step1"的文件夹!
在实际编程中,可以结合函数exist使用。
比如:
ifexist('Step1')==0
system('mkdirStep1');
end
即:
先判断当前目录下是否以存在名为Step1的子目录(文件夹),如果不存在,则建立!
5.以前一直忽略了这个最简单也最实用的小技巧:
如果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- matlab 编程 技巧