- 积分
- 92132
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2011-8-2
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 二爷名声在外 于 2015-1-14 08:55 编辑
本文转自知乎,原链接:MATLAB 中有哪些命令,让人相见恨晚?,整理:二爷名声在外。
——————————————————————————————
Matlab里面应该多用向量运算,把循环语句转变为向量运算会省很多时间,程序也更简洁易读。
比方说,一个名叫array数组里面,你要将里面大于1的都变成0,就不必用到循环:
array(array>1)=0;
把大于1小于3的变成0。
array(and(array>1,array<3))=0;
当然,还可以使用find,这个也很好用。
——————————————————————————————
另一个重要的技巧是delete/clf-plot-pause
用plot可以画图(注意记录句柄),然后用delete删掉特定图象,或用clf清图,再绘制,这可以在figure窗口产生动画。但是如果只plot,往往只会在全部程序执行结束时显示,这时候需要用pause让figure完成图像的更新。drawnow貌似也可以,但是我比较喜欢用pause,能够简单地控制动画的速度。
这会方便调试和展示。这个技巧尤其适合使用matlab的图形用户界面设计功能时构造一个显示运行状态等信息的figure。
——————————————————————————————
mathworks 有一个fig函数(不是系统自带的,是别人编写的),可以很容易地调整字体、尺寸以及绘图是否有边框等等,不必画出来再自己手动调整。这对于写论文的人来说会很方便。
——————————————————————————————
善用eval,可以让你的程序的灵活度大大加强。尤其是在变量名的问题上。当然,这可能会对代码维护和调试带来麻烦。很多情况可以用其他方法代替。 @王备 指出了一个链接,值得一读Alternatives to the eval Function
——————————————————————————————
save、load可以将部分或全部变量、结构体等存入mat文件或从mat导入workspace
global可以将变量变为全局变量,在各函数之间共享。不过这不太好用,尽量慎用吧。
——————————————————————————————
exist可以检测某目标(如变量)是否存在,减少一些麻烦。
——————————————————————————————
surf、mesh都很漂亮,不过surf之后记得用shading interp,看起来更漂亮。
——————————————————————————————
对于一些重复性的矩阵赋值,比如:1、2、3、4、1、2、3、4
可以使用repmat,将一个矩阵重复扩展为更大的矩阵。
——————————————————————————————
很多函数都有高级的用法,当使用到了,但又觉得有点麻烦的时候,不妨help一下,看看其他的用法。
——————————————————————————————
1. 转置但不共轭
b = a.'
2. 得到列向量
b = a(:)
相应的,得到行向量就是
b = a(:).'
3. 清除并更新所有 class 的定义
clear classes
当你修改了某些 class 的定义时,需要调用此命令——仅仅 clear all 是不够的。
4. 忽略某些返回参数
[~, idx] = max(a)
忽略最大值,只返回最大值的索引。
【注】
这种语法是在 Matlab 7.9 (2009b) 中引入的,在此之前的版本不支持这种用法。如果你使用早期版本,可以使用如下写法:
[tmp, idx] = max(a); clear tmp
或者一句话搞定
[idx, idx] = max(a)
不过第二种写法不见得每个人都会喜欢。
5. 去除长度为 1 的维度(常用于 3D 矩阵转为 2D)
b = squeeze(a)
Simulink 的 save to workspace 模块经常得到一个 [m x 1 x n] 的三维矩阵,直接使用非常不便。使用 squeeze 后,会将其转换为 [m x n] 的二维矩阵。
6. 代码运行耗时显示
tic;
some_code_to_run();
toc
tic/toc 会在 Matlab 命令行中打印出两条命令之间的代码的运行耗时。更详细的代码效率分析,可以使用 profile 命令。
7. 电脑跑分
bench
只能用于相同版本的 Matlab 下电脑之间的比较。
8. 记录命令行命令
diary on% Lots of my Matlab commands here.diary off
使用 diary 好处是运行结果也会被记录下来,并且以纯文本方式存储,方便编辑。更正式的报告,则推荐使用 publish。
9. 反转向量
b = fliplr(a) % For row-vector a.
b = flipud(a) % For column-vector a.
b = wrev(a) % For any vector a.
b = a(end:-1:1); % This is the implementation of function wrev.
10. 去除数据中的 NaN
a(isnan(a)) = []
对于 inf 和 -inf,使用 isinf 命令。
——————————————————————————————
bsxfun
强大的、万能的、不同维数的矩阵扩展混合运算,从此告别矩阵运算中的for循环
另,matlab里所有以fun为后缀的命令都很好用,arrayfun,cellfun,structfun,等等
@() 匿名函数
使用函数式编程,在编写以数学公式为主的程序中比传统编程方法好得多
set(gca,...)等
所有与画图相关的命令都包含了千奇百怪的属性和参数,非常实用,如著名的 set(gca,...)
$ $
画图中的标题、注释等文字内容是可以直接使用latex格式的,只须在包含latex命令的部分前后用$框起来即可
slice
高维切片,要在三维空间中表现三个以上变量的函数关系,必备此命令
——————————————————————————————
1. 可以用nohup matlab <script.m> result.out &把程序丢到linux服务器上后台跑,然后exit即可安全退出,第二天在result.out中查看结果;
2. matlab -nojvm -nodisplay -nodesktop 不启动图形界面跑matlab,比有图形界面要快一些;
3. 没有图形界面调程序的时候,cd/pwd/cd ../ls等doc命令就很有用了;
4. clear all,clc,ctrl+C中断正在跑的程序(比如死循环了)什么的;
5. find (查找矩阵元素不需要循环遍历);
6. cmd = sprint ('command'); system(cmd); 在服务器上跑Linux指令;
7. 第二句改成eval(cmd)也有相似效果,没研究过区别。
——————————————————————————————
1,which命令,可以找到命令所在的具体路径
例如:
>> which fftbuilt-in (D:\MATLAB\R2008b\toolbox\matlab\datafun\@logical\fft) % logical method
另外,新版的matlab在命令行双击tab能自动补全。
2,获得一个变量的类型,用class函数
例如:>> class([0 1]) % double>> class('test') % char
3,画直方图。(看看导入是多么方便,直方图也一句搞定)
一般成绩统计是用excel来统计的,就把那一列复制成一个文本文件,比如score.txt
79826594...
1)Matlab先把数据导入myscore变量:
>> myscore=importdata('score.txt');
成绩一个N*1的列向量myscore,N是学生人数。
2)然后用这些成绩做个直方图:
>> hist(myscore);
这句就画出直方图(histogram)了。所谓直方图,就是把各成绩段,按照落入各个区间的数量,画出柱状图。(横坐标为成绩分布区间,纵坐标为落入对应区间的成绩个数)。
4,在matlab里使用LaTeX
图的标题或标记中可以用LaTeX书写公式。
例如:为图加标题时,用
title('$$f(x)=cos(x)$$', 'interpreter','latex' );
这里title函数的格式是 title(...,'PropertyName',PropertyValue),
后面两个参数表示使用latex语法处理字符串(经测试,否则会当做普通字符串处理),其他命令有类似选项。
LaTeX表示的数学公式的前后用$ $, 或$$ $$或 \( \),三种形式中的任意一个。
5,画多幅图
1)叠加多幅图时,可以用hold on命令保持住,然后可以继续往上面叠加图(如plot等命令),最后hold off。
2)画多个子图,用subplot命令,例如subplot( 2, 4, 1) 是2行4列的第1幅子图,接着用plot等命令画图,下一个subplot命令切换到下一子图 ......。
——————————————————————————————
1.freqz
2.fir1,fir2等一系列示波器构造相关函数
3.用text函数直接在figure中写出latex风格公式;(有时Matlab/C风格的文本格式公式咋看之下太难懂)
比如说:
syms x;text(.5,.5,['$',latex(x^(2*x^x+x/3)),'$'],'interpreter','latex','HorizontalAlignment','center','fontsize',18)
4.我写过一个主要用dir,system,zip这几个函数管理打包下载好的漫画的小脚本。
5.其实工具也算是命令的封装,常用并觉得好用的一般有拟合工具,小波等时频分析工具,神经网络,还有射频相关的小工具
6.快捷键ctrl+i,不算命令,我觉得不少人不知道这个
7. 开着电脑,matlab和音箱,然后在办公室有人的时候远程自己的电脑,让自己电脑突然说话。。。【我觉得还是Mathematica的某个函数好使一些~】
sp=actxserver('SAPI.SpVoice');sp.Speak('hello')
8.eval,比如可以轻易批量生成m1到m8这些具有规律的变量名
——————————————————————————————
Why
-----
好奇可以自己试试。。
——————————————————————————————
在命令行敲入 dbstop if error
如果运行出现错误,matlab会自动停在出错的那行,并且保存所有相关变量。再也不用设断点了有没有!!!
——————————————————————————————
delete matlab
——————————————————————————————
学无止境,如果大家有什么新的发现和建议,欢迎联系我,本帖不断更新!
|
评分
-
查看全部评分
|