matlab软件编程的方法,加快Matlab程序编程效率的建议
发布日期:2022-02-10 01:26:34 浏览次数:3 分类:技术文章

本文共 1908 字,大约阅读时间需要 6 分钟。

因为 MATLAB 语言是一种解释性语言,所以有时 MATLAB 程序的执行速度不是很理想。这里将依照作者十多年的实际编程经验给出加快 MATLAB 程序执行速度的一些建议和体会。

尽量避免使用循环:循环语句及循环体经常被认为是~MATLAB 编程的瓶颈问题。改进这样的状况有两种方法:

(1) 尽量用向量化的运算来代替循环操作。我们将通过如下的例子来演示如何将一般的循环结构转换成向量化的语句。

〖例3.19〗考虑下面无穷级数求和问题:

如果我们只求出其中前有限项,比如 100,000 项之和 (要精确地求出级数的和,无需求 100000 项,几十项往往就能得出满意的精度。这里主要是为了演示循环运算向量化的优越性。),则可以采用下面的常规语句进行计算

>> tic, s=0;

for i=1:100000, s=s+(1/2^i+1/3^i); end, s,toc

s =

1.5000

elapsed_time =

1.9700

如果采用向量化的方法,则可以得出下面结果。可以看出,采取向量化的方法比常规循环运算效率要高得多。

>> tic, i=1:100000; s=sum(1./2.^i+1./3.^i), toc

s =

1.5000

elapsed_time =

0.3800

(2)在必须使用多重循环的情况下,如果两个循环执行的次数不同,则建议在循环的外环执行循环次数少的,内环执行循环次数多的。这样也可以显著提高速度。

〖例3.20〗考虑生成一个 5x10000 的 Hilbert 长方矩阵,该矩阵的定义是其第 i 行第 j 列元素为 h_{i,j}=1/(i+j-1)。我们可以由下面语句比较先进行 i=1:5 的循环和后进行该循环的耗时区别,其效果和前面分析的是一致的。

>> tic

for i=1:5

for j=1:10000

H(i,j)=1/(i+j-1);

end

end

toc

elapsed_time =

8.6800

>> tic,

for j=1:10000

for i=1:5

J(i,j)=1/(i+j-1);

end

end

toc

elapsed_time =

25.7000

大型矩阵的预先定维

给大型矩阵动态地定维是个很费时间的事。建议在定义大矩阵时,首先用 MATLAB 的内在函数,如zeros() 或 ones() 对之先进行定维,然后再进行赋值处理,这样会显著减少所需的时间的。

再考虑例 3-20 中的问题,如果输入下面的命令

>> tic

H=zeros(5,10000);

for i=1:5

for j=1:10000

H(i,j)=1/(i+j-1);

end

end

toc

elapsed_time =

1.0400

则采用预先定维的方法,再结合向量化的方法,我们可以给出下面的 MATLAB 语句。

>> tic

H=zeros(5,10000);

for i=1:5

H(i,:)=1./[i:i+9999];

end

toc

elapsed_time =

0.060

可见,预先定维后,所需要的时间显著地减少了。可以看出,同样一个问题,由于采用了有效的措施,所需的时间就可以从 25.7 秒减少到 0.06 秒,亦即效率提高了 428 倍。

对二重循环这样的特殊问题,我们还可以使用 meshgrid() 函数构造两个 5x10000 矩阵 i 和 j,从而直接得出 H 矩阵,更进一步地加快速度。

>> tic, [i,j]=meshgrid(1:5,1:10000); H=1./(i+j-1); toc

elapsed_time =

0

优先考虑内在函数

矩阵运算应该尽量采用 MATLAB 的内在函数,因为内在函数是由更底层的编程语言 C 构造的,其执行速度显然快于使用循环的矩阵运算。

采用有效的算法

在实际应用中,解决同样的数学问题经常有各种各样的算法。例如求解定积分的数值解法在 MATLAB

中就提供了两个函数 quad() 和 quad8(),其中后一个算法在精度、速度上都明显高于前一种方法。所以说,在科学计算领域是存在“多快好省”的途径的。如果一个方法不能满足要求,可以尝试其他的方法。

应用 Mex 技术

虽然采用了很多措施,但执行速度仍然很慢,比如说耗时的循环是不可避免的,这样就应该考虑用其他语言,如 C 或 Fortran 语言。按照 Mex 技术要求的格式编写相应部分的程序,然后通过编译联接,形成在 MATLAB 可以直接调用的动态连接库 (DLL) 文件,这样可以显著地加快运算速度。

转载地址:https://blog.csdn.net/weixin_33595317/article/details/115956750 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Oracle11G数据泵支持,Oracle11gr2数据泵新特性(二)
下一篇:java springmvc配置,java-springmvc配置

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2023年06月07日 14时41分12秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章

mail java mail_使用 JavaMail 实现邮件发送与收取 2019-12-01 13:16:45
linux mysql安装失败 lib冲突问题_Linux安装遇到的问题 2019-12-01 13:16:42
mysql生成饼状图_ireport 5.6教程之饼图制作过程 2019-12-01 13:16:42
mysql 出现 quot_oracl出现"ORA 2019-12-01 13:16:43
sphinx mysql 数据源_3.7.SQL 数据源 (MySQL, PostgreSQL) - Sphinx 0.9.9/Coreseek 3.2 参考手册... 2019-12-01 13:16:43
java oracle 事务 锁_oracle 事务简介,锁的概念,java访问数据库注意事项 2019-12-01 13:16:43
java中socket与多线程_Java Socket多线程编程、通信模型及socket协议详解 2019-12-01 13:16:43
main map java_Java从入门到实战之(12)Map示例大全(一) 2019-12-01 13:16:43
c++由大到小输出所有的各位和小于6的三位整数_小学数学16年级所有重点知识点汇总,难得这么全了!... 2019-12-01 13:16:41
mysql哟普话_mysql常用语句列表 2019-12-01 13:16:41
python unittest框架有哪些方法_python单元测试之unittest框架使用总结 2019-12-01 13:16:41
python命令行编程和函数式编程的区别_Python基础学习代码之函数和函数式编程 2019-12-01 13:16:41
python多个定时任务_python单线程实现多个定时器示例 2019-12-01 13:16:41
vfp 连接mysql数据库_VFP与SQL远程异构数据库_mysql 2019-12-01 13:16:41
在下列集成电路说法中不正确_模拟集成电路复习题1 2019-12-01 13:16:42
beego api连接mysql_使用 Beego 搭建 Restful API 项目 2019-12-01 13:16:42
python设计简单系统、不含数据库_python之数据库支持 2019-12-01 13:16:40
联想笔记本mysql启动不了_目前安装并启动mysql遇到的问题: 2019-12-01 13:16:40
hql 占位符_hibernate查询语句hql中的占位符?参数与命名参数:name设值方式搞混 2019-12-01 13:16:40
mysql加索引原理_添加mysql索引的3条原则 2019-12-01 13:16:40