[摘要]

MATLAB是一种科学计算语言,和C、Fortran等高级语言相类似,能方便的实现程序控制。以下介绍一点matlab编程的技巧。

嵌套计算

程序执行的速度取决于调用的子程序的个数和算法实现。通常希望子程序越少越好。嵌套可以有效地减少子程序。

一个典型的例子就是多项式的求值计算:p(x)=a3x3+a2x2+a1x+a0和p(x)=((a3x+a2)x+a1)x+a0两者的结果相同,但是计算量不一样。

N=100000;
a=[1:N];
x=1;
tic
p1=sum(a.*x.^[N-1:-1:0]);
p1, toc
tic,p2=a(1);
for i=2:N
p2=p2*x+a(i);
end
p2,toc
tic,p3=polyval(a,x),toc p1 = 5.0001e+09 时间已过 0.079124 秒。 p2 = 5.0001e+09 时间已过 0.018267 秒。 p3 = 5.0001e+09 时间已过 0.212526 秒。

例:计算possion分布:S(M)=∑Mn=0λnn!e−λ当M很大的时候的值。

tic
r=80;
M=160;
sum=0;
for n=1:M
temp=1;
for k=1:n
temp=temp*k;
end
sum=sum+r^n/temp*exp(-r);
end
sum,toc sum = 1.0000 时间已过 0.002170 秒。

循环结构

matlab中的循环语句主要有for和while。其基本格式为:

  • for循环

for 循环变量=初值:步长:终值

循环体语句

end

  • while循环

while 条件

循环语句

end

注意事项:

  1. 尽量避免使用循环。matlab中循环速度较低,应该尽量使用向量运算代替循环。
  2. 为了提高速度,在for循环之前,应该分配数组。
  3. 有限考虑内联函数(inline)。
  4. 应用MEX技术。

循环和嵌套

程序的嵌套是指在程序执行的过程中调用自身的过程。又称为递归调用。

例如:计算100!

  • 利用循环
tic
M=100;
f=1;
for i=2:M
f=f*i;
end
f,toc f = 9.3326e+157 时间已过 0.000259 秒。
  • 利用嵌套
function m=hello(n)
if n<=1
m=1;
else
m=n*hello(n-1);
end >> tic,hello(100),toc ans = 9.3326e+157 时间已过 0.002535 秒。
可见自身嵌套速度较慢。

例外处理机制

编程人员要时刻注意:尽量多的为用户考虑,让程序及时的把正确的结果返回,如果出现错误,也会有好的提醒用户错误的原因以及改正的方法。


全局变量的使用

全局变量是指在不同的工作空间以及基本的工作空间中可以共享的变量。用户只需在主程序或者任何子程序中声明一个或者多个全局变量,则函数和主程序中都可以直接饮用它们。声明格式如下:

global v1 v2 v3 … vn (表达式就之间用空格隔开)

使用全局变量要注意的事项:

  1. 它可以在主程序和函数之间不需要经过输入或者输出就直接传递数据。但要注意在调用结束后,全局变量依然存在。
  2. 两个或者多个函数可以共有一个全局变量,只要同时在这些函数中用global语句加以定义即可。
  3. 使用全局变量要很小心才是,最好把全局变量全部大写,以免与函数中的局部变量重名。
  4. 一旦声明了全局变量,则在程序的任何地方都可以对其修改,这破坏了程序的相对独立性。(个人觉得能少用,就尽量少用这个功能。)

通过varargin传递参数

在编写函数的时候,varvargin只能做为函数的最后一个参数,主要传递函数中调用的子函数的可选项的参数,其大小也随着输入参量的变化而发生改变。

MATLAB编程技巧的更多相关文章

  1. Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)

    原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之——找出Matlab内置函数中,已经大概的介绍了mat ...

  2. Matlab.NET混合编程技巧之——找出Matlab内置函数

    原文:[原创]Matlab.NET混合编程技巧之--找出Matlab内置函数 Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯定不难.反之,有时候一个小错误,可能抓破 ...

  3. 一些matlab教程资源收藏,使用matlab编程的人还是挺多的

    Matlab教程专题资源免费下载整理合集收藏 <MATLAB从入门到精通>高清文字版[PDF] 103.9MB 简体中文 <矩阵实验室>(Mathworks.Matlab.R2 ...

  4. js异步编程技巧一

    异步回调是js的一大特性,理解好用好这个特性可以写出很高质量的代码.分享一些实际用的一些异步编程技巧. 1.我们有些应用环境是需要等待两个http请求或IO操作返回后进行后续逻辑的处理.而这种情况使用 ...

  5. Matlab小技巧

    记录一些用Matlab的技巧. //imshow全屏 subplot(1,3,3); imshow(topSketMat); hold on; set(gcf, 'units', 'normalize ...

  6. EF – 2.EF数据查询基础(上)查询数据的实用编程技巧

    目录 5.4.1 查询符合条件的单条记录 EF使用SingleOrDefault()和Find()两个方法查询符合条件的单条记录. 5.4.2 Entity Framework中的内部数据缓存 DbS ...

  7. MATLAB 编程风格指南及注意事项

    MATLAB编程风格指南Richard Johnson 著Genial 译MATLAB 编程风格指南Richard JohnsonVersion 1.5,Oct. 2002版权: Datatool 所 ...

  8. VC多文档编程技巧(取消一开始时打开的空白文档)

    VC多文档编程技巧(取消一开始时打开的空白文档) http://blog.csdn.net/crazyvoice/article/details/6185461 VC多文档编程技巧(取消一开始时打开的 ...

  9. java命名规范和编程技巧

    一个好的java程序首先命名要规范. 命名规范 定义这个规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,方便维护等作用 Package 的命名 Package 的名字应该都是由一个小写 ...

随机推荐

  1. 设置eclipse的Maven插件引入依赖jar包后自动下载并关联相应的源码(转)

    好多用 Maven 的时候会遇到这样一个棘手的问题: 就是添加依赖后由于没有下载并关联源码,导致自动提示无法出现正确的方法名,而且不安装反编译器的情况下不能进入方法内部看具体实现 . 其实 eclip ...

  2. Python面向对象之组合

    # 组合: 给一个类的对象封装一个属性,这个属性是另一个类的对象. class GameRole: def __init__(self, name, ad, hp): self.name = name ...

  3. A-坐飞机

    链接:https://ac.nowcoder.com/acm/contest/892/A 题意: 鸡尾酒要去很多很多地方玩,于是他一次买了 n 张机票,初始鸡尾酒在第一个城市,对于任意的i(1≤i≤n ...

  4. 转 v$session_longops视图

    转http://www.dbdream.com.cn/2013/10/14/vsession_longops%E8%A7%86%E5%9B%BE/ 1.有的时候不准确 ,我看到 session wai ...

  5. SpringBoot---核心---日志配置

  6. 数据库2_sqlHelper

    封装一个受影响的行 public static int ExcuteNonQuery(string sqlText,params SqlParameter[] parameters) { using ...

  7. Spring Cloud--搭建Eureka注册中心服务

    使用RestTemplate远程调用服务的弊端: Eureka注册中心: Eureka原理: 搭建Eureka服务 引pom 启动类: 启动类上要加上@EnableEurekaServer注解: 配置 ...

  8. Java并发(一):基础概念

    对于Java并发,我也是属初学阶段,用的参考书是:"Java并发编程实战",写博时也参考了很多类似主题的博客,博主意在记录自己的学习路程,供网友讨论学习之用; 周末写的差不多了,今 ...

  9. jdk动态代理和cglib动态代理的区别

    一.原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. 而cglib动态代理是利用asm开源包,对代理对象类的class文件 ...

  10. springboot集成shiro实现权限缓存和记住我

    到这节为止,我们已经实现了身份验证和权限验证.但是,如果我们登录之后多次访问http://localhost:8080/userInfo/userDel的话,会发现权限验证会每次都执行一次.这是有问题 ...