Matlab是一个基于矩阵运算的软件,这恐怕是众所周知的事情了,但是,真正在运用的时候(就是在编程的时候),许多人(特别是初学者)往往没有注意到这个问题,因此,for循环(包括while循环)满天飞…………..这不仅是暴殄天物(没有发挥matlab所长),还浪费了你宝贵的时间。对此,版友MVH在他的“MATLAB 小技巧”一文中也有所涉及,雷同的东西我也就不重复了,matlab的“帮助”里面也有相关的指示。我这里想说的一点是,初学者往往在初始化矩阵的时候注意到这个问题,懂得了使用矩阵而不是循环来赋值,但是,在其他环节上,就很容易疏忽,或者说,仍然没有摆脱C++的思想。举个例子吧,下面的代码是我的一个师弟写的,我想他接触matlab也有2、3年时间了(在此说明一下,接触2、3年并不是表示每天都会跟matlab打交道,我本人也不是,只是在一年某几个时间段里面连续使用),但是仍然会出现类似的问题:

J = 0;

lt = size(imf1,2);

for (i = 1:lt)

if (abs(imf1(i)) > 1)

J = 1;

break

end

end

上面的代码实现了一个目的――检查信号imf1(一个向量)是否存在绝对值大于1的点,这显然是基于C++的思想写出来的。如果在matlab下面,其实用两个语句就足够了(当然,可以合并为一个):

q = find(imf1>1);

J = ~isempty(q);

这样的修改带来的好处是很可观的。

又如:

for j = 1:num

imf1(start1+j) = 2*li1(j+1) - imf1(start1+j);

end

这是一个对称翻折的问题,它完全可以用以下这个语句简洁表示:

imf1(start1+1:start1+num) = 2*li1(2:num+1) - imf1(start1+1:start1+num);

因此,如果是新手,可以先用循环(基于C++的思想)来编写代码,然后看看能否用matlab的语言(基于矩阵的思想)来改进。当然,这样做的前提是你对matlab提供的一些函数比较熟悉才行,这些函数在matlab的“帮助”那里搜索“Functions Used in Vectorizing”就可以找到一些,其他的也可以找相关的书籍(没找到?不可能,电子版总可以下载到的)

对提高matlab编程能力的方法,我想主要有以下三个:

1. 查help

2. 多上上论坛,搜索帖子、发帖子问人

3. 阅读别人、特别是牛人的程序

当然了,正如所有的程序语言一样,“3分课本7分上机”,一定要动手才行,不能光看。多想、多思考、多尝试,才是正路。以下技巧就是平日动手编程、阅读别人的帖子后整理出来的(不断添加中):

1. matlab的运算是基于矩阵的,但是也提供了对应元素的运算,即在运算符前面加上“点”。例如:

>> a = [1,2;3,4]

a =

1      2

3      4

>> b = [-1,-2;-3,0]

b =

-1     -2

-3      0

>> a * b

ans =

-7     -2

-15     -6

>> a .* b

ans =

-1     -4

-9      0

也就是说,没有加“点”的运算是对整个矩阵而言的,称为矩阵运算(整体运算),而加了“点”的运算是对每个元素而言的,称为点运算(局部运算)。另外,一般情况下,matlab作点运算(理解为左右两个对象(矩阵)的对应元素参与该运算)时,两个矩阵的维数和长度都要求是同大小的,且此时要在运算法前面添加“点”,但是在某些情况下该“点”可以省略,例如一个标量a和一个向量b(或者矩阵)相加、相减、相乘、b/a时都可以不需要加点,表示b中每个元素都和a进行运算(即点运算的效果)

2. 强烈建议大家在命名自己的函数名(更加准确应该说m文件名)时,在名称前面加上 my 等个人专用标识,即假如你要把你的函数命名为conv,则最好写成 myConv,否则容易与matlab自带的函数(m文件)名字重复而导致“Attempt to execute SCRIPT conv as a function”的错误!当你碰到这个错误时,可以在命令窗口中输入 which conv all 来看看到底有否重复命名了该函数,有的话,建议把自己命名的文件改名,保留 matlab 自带的文件。

3. 条件判断中,y==0, a-b==0这类语句应该尽量减少使用,除非你可以保证y、a、b在整个计算过程中是整数,否则两个浮点数相减、或者一个浮点数不可能完全等于0

4. 循环变量递减时必须显式给出步长,即 i = 5:-1:-5 (假设步长为-1),如果递增时且步长为1,则可以省略,简写作 i = -5:5

5. 在引号环境下的语句中,如果需要使用单引号,则要写成两个单引号的形式,不能用一个双引号代替!例如: ...'callback','[imp,Fs,bits]=wavread(''temp.wav'');'   文件名 temp.wav 外面的是两个单引号

6. 如果你编写的函数带有输入参数(例如 x ),则跟其他语言一样,这只是形式参数,所以不能通过直接运行该函数(或者m文件)来测试,这样会出现 ??? Input argument "x" is undefined. 的错误。一定要从其他地方(如命令窗口或者其他函数对其调用)来传递真实值,此时 x 才是实际参数。如果你有C语言的编程经验,命令窗口就相当于main函数;如果没有,以下是举例:

myPlus.m:

[Copy to clipboard] [ - ]CODE:

function d = myPlus(a,b)

d = a + b;

命令窗口:

[Copy to clipboard] [ - ]CODE:

>> x = 2;

>> y = 5;

>> z = myPlus(x,y)

此外,和每一种编程语言一样,所有定义的变量都有一定的作用域。虽然matlab 宣称变量不需要定义即可以直接使用,但是,事实上一个简单的赋值语句便包含定义+初始化了,因此,如果直接使用未定义的变量(最常用的是在“=”右边首次出现),则会出现“Undefined function or variable” 的错误!例如:

[Copy to clipboard] [ - ]CODE:

function y = myTest(x)

z = x * 2;

z = t + z;

则运行时 matlab 会报错:Undefined function or variable t !

因此,强烈建议在使用变量之前(特别是循环中使用数组),先预分配空间,这样容易减少很多莫名其妙的错误,具体做法参见以下图片:

preallocate.bmp (222.48 KB)

2007-5-18 10:55

7. 如何调试程序:编好程序,设置断点(m文件编辑窗口中菜单 Debug 有 Set/Clear breakpoint),运行程序(菜单 Debug 有 Run 或 Save & Run)

8. 对于matlab自带函数(命令)的问题,请多利用matlab的帮助功能。即在命令窗口中输入: help eval 或者 doc eval。更多的帮助指令请参阅以下链接的帖子:[转帖]MATLAB中的帮助指令

9. 对于 mat 文件的读取,由于存放的是结构体数组,因此调用 A = load('*.mat') 后,得到的 A 并非原始数据,而是一个结构体,此时需要使用".域名" 才能正确得到数据,例如:

[Copy to clipboard] [ - ]CODE:

A =load('*.mat');

后得到:

A =

Signal: [85x7794x64 single]

TargetChar: [1x85 char]

Flashing: [85x7794 single]

StimulusCode: [85x7794 single]

StimulusType: [85x7794 single]

则用:

[Copy to clipboard] [ - ]CODE:

B = fieldnames(A);

可得到各结构体的域名。

如果要获得各域中(下以 Signal 为例)的数据,必须用:

[Copy to clipboard] [ - ]CODE:

S = A.(B{1});

此外,不建议使用 load *; 这种方式读取 mat 文件(读取 dat 等其他格式的文件也是类似),因为此时读取后的变量名是存储时设定的,假若文件并非您本人存储,则无法获悉这个变量名,通过这种方式是无法在读取时候指定数据存放在哪个变量中的,这样将会导致下文不知道使用哪个变量名,甚至会导致出错!因此,强烈建议采用A = load('*.mat'); 方式进行读取,当然了,如果文件是您本人存储的,则用前面的方式比较简便,这另当别论。下面以 dat 文件作为例子说明:

clear all

>> a = magic(4);   b = ones(2, 4) * -5.7;   c = [8 6 4 2];

>> save -ascii 1_data.dat

>> load 1_data.dat

因为这种方式的读取是把数据默认存放在以“不含后缀的文件名”命名的变量中(这里为 1_data),但是由于 1_data 不是合法的标识符,因此 matlab 自动改成 X1_data(不同版本的matlab可能不同),即读取出来的数据事实上是存放在 X1_data 变量中。如果使用 m 文件方式编程(即 load 1_data.dat 后有分号),则这个变量名根本不会显示出来,也就是说,对它的改名你是毫不知情的,这时候下文继续使用 1_data 的话,就会产生错误。

10. matlab 对中文的文件路径(不光是文件名)不太支持,特别是 6.5 版本。

最后,整理一下常用的快捷键(用【】表示)或命令:

1. 在命令窗口(Command Window)中:

1) 【上、下键】――切换到之前、之后的命令,可以重复按多次来达到你想要的命令

2) clc――清除命令窗口显示的语句,此命令并不清空当前工作区的变量,仅仅是把屏幕上显示出来的语句清除掉

3) clear――这个才是清空当前工作区的变量命令,常用语句clear all来完成

4) 【Tab】键――(转自版友心灯)在matlab@hit.edu.cn看到的:在command窗口,输入一个命令的前几个字符,然后按tab键,会弹出前面含这几个字符的所有命令,找到你要的命令,回车,就可以自动完成。目前讨论结果是:matlab6.5版本中,如果候选命令超过100个,则不显示。而在matlab7以后版本中,则没有这个限制,均可正常提示

5) 【Ctrl+C】(或【Ctrl+Break】)――(转自版友yangjin_ren)在matlab程序运行过程中,可能由于程序编写的失误,导致程序不停的运行,在命令窗口输入“Ctrl+C”可以将运行的程序停下来,而不需要将整个Matlab程序关掉。不过进行此操作的前提是能够激活切换到命令窗口才行,呵呵。

2. 在编辑器(Editor)中:

1) 【Tab】(或【Ctrl+]】)――增加缩进(对多行有效)

2) 【Ctrl+[】--减少缩进(对多行有效)

3) 【Ctrl+I】--自动缩进(即自动排版,对多行有效)

4) 【Ctrl+R】――注释(对多行有效)

5) 【Ctrl+T】――去掉注释(对多行有效)

6) 【Ctrl+B】――括号配对检查(对版本6.5有效,但版本7.0以上无效,matlab把这项功能自动集成到编辑器里面了,即在m文件编辑窗口中会自动进行括号配对检查,并在窗口右侧有红橙绿三灯提示,具体请参考以下帖子:http://www.simwe.com/forum/thread-746722-1-4.html )

7) 【F12】――设置或取消断点

8) 【F5】――运行程序

其余的例如在Debug状态下的快捷键就不多说了,自己看菜单Debug吧

MATLAB学习心得~相关推荐

  1. 学习matlab体会,matlab学习心得体会

    MATLAB是一个实用性很强,操作相对容易,比较完善的工具软件,你知道matlab学习心得体会是什么吗?接下来就是学习啦小编为大家整理的关于matlab学习心得体会,供大家阅读! matlab学习心得 ...

  2. Matlab学习心得

    Matlab学习心得 批量处理试验数据 批量处理试验数据 使用到的新内容包括: 1.批量导出word图:创建一个新的word文档,并将绘制出来的figure粘贴到word中. 2.批量处理变量a1,a ...

  3. MATLAB 学习心得(3) 定积分和双重积分,三重积分的求法

    一.定积分 定积分的求法: y = quad(@Fun,a,b)       Fun为函数,a为下限,b为上限 y = quad(@Fun,a,b,ε)    ε为误差,默认为10^(-6) 用qua ...

  4. matlab实验学习心得,matlab实验心得体会-学习matlab的心得体会

    matlab实验心得体会-学习matlab的心得体会 导语:通过对MATLAB的系统环境,数据的各种运算,矩阵的分析和处理,程序设计,绘图,数值计算及符号运算的学习,初步掌握了MATLAB的实用方法. ...

  5. matlab论文 总结,matlab学习论文和心得体会.doc

    matlab学习论文和心得体会 学校代码 10672 编 号 Guizhou Minzu University <MATLAB>学习论文 论文题目: 学院(系): 专 业: 年 级: 姓 ...

  6. MATLAB地图工具箱学习心得(二)设计可变参数和位置拾取的“放大镜”式投影程序

    最近刚好因为一些原因整理这方面的内容,所以还是把这篇鸽了一年多的博客顺手写出来了∠( ᐛ 」∠)_.因为是当时课程设计的一部分,程序上难免会有一些不足和bug,在这里将设计的思路分享给大家. 本篇博客 ...

  7. 2014中国计量学院matlab考试卷,中国计量学院学习心得

    中国计量学院学习体会 2014年5月26日至30日在杭州中国计量学院参加了为期一周的训练学习,虽然时间短,但利益浅薄. 在此总结了学习情况. 一.中国计量学院介绍 中国计量学院位于历史文化名城.旅游休 ...

  8. 数字信号处理matlab心得,数字信号处理学习心得体会3篇

    <数字信号处理>是我们通信工程和电子类专业的一门重要的专业基础课程,主要任务是研究数字信号处理理论的基本概念和基本分析方法,通过建立数学模型和适当的数学分析处理,来展示这些理论和方法的实际 ...

  9. matlab实验是啥,matlab实验心得体会

    matlab实验心得体会这个就是我自己做出来的,发现用soundsc听出来还行,但是用wavwrite就变的很难听. 后来发现PB写的很好,而且还能够把前面一段没有噪音的部分给保存下来,我就看了他的代 ...

最新文章

  1. Hinton最新访谈:GPT-3和人脑比参数量仍少1000倍
  2. 关于三岔路口双车接力,这位同学把问题总算问清楚了
  3. Laravel 5 中间件、路由群组、子域名路由、 权限控制的基本使用方法
  4. linux 虚拟机添加网卡
  5. 我说我了解集合类,面试官竟然问我为啥HashMap的负载因子不设置成1!?
  6. 09年职称计算机考试,09年职称计算机考试试题A.doc
  7. (一)GPS与基站定位
  8. python下载pyhive包:
  9. C语言程序设计--新生入学登记系统
  10. 机器人仿真搭建(以ABB为例)
  11. c语言字符动画源码下载,C语言程序实例大全(220个精彩源码下载)
  12. 51单片机最小系统原理分析
  13. 京冀津城际铁路网规划大全
  14. 微软Xbox击败PS4 主导“黑五”游戏机市场
  15. 店盈通电商:拼多多发货地址不一样有关系吗?
  16. 机器学习(四):剪枝技术(基础篇)
  17. 30岁后再转行程序员,能行吗?
  18. 学习笔记:min-width和min-height
  19. 学生参加计算机比赛后的分析,湘南学院学生参加基本功大赛篮球比赛成绩分析和反思.doc...
  20. 传实缴注册资本要5亿,那些想上市的P2P平台顶得住吗?

热门文章

  1. 利用媒体查询实现仿星巴克首页布局页面
  2. java调用有参方法_java 带参方法调用
  3. 中秋国庆旅游 App 市场竞争激烈!工具类 App 更易被苹果推荐!
  4. c语言中%if是什么意思,C语言中if(!a)表示什么意思?
  5. FPGA-Vivado
  6. 后端面经(已收到腾讯实习offer)
  7. 微信公众帐号开发教程第2篇-开发模式启用及接口配置
  8. win10新建虚拟机网络配置未连接服务器,win10虚拟主机怎么联网(win10虚拟机连不上网)...
  9. 【电路理论】1-10 两类约束 KVL、KCL方程的独立性
  10. Linux服务器开发,Posix API与网络协议栈