[我分享] 【参与有奖】讨论:你更习惯用MATLAB脚本还是MATLAB函数?

  [复制链接]
ilovematlab 发表于 2016-11-3 17:18:48
MATLAB将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言的编辑模式,代表了当今国际科学计算软件的先进水平。与其他计算机语言相比,MATLAB更加接近人们书写计算公式的思维方式,其程序编写就像是在演算纸上列出公式进行求解的过程,这使人们摆脱了许多重复、复杂的机械性的编程细节,把注意力集中在创造性问题上,用尽可能短的时间得到有价值的结果。MATLAB还具有编程简单,节省时间,提高效率,易学易懂,功能强大,适用范围广,移植性和开放性强等特点,是在校大学生继续进行科学研究必须掌握的基本技能。

本次话题:
  • 你更习惯用MATLAB脚本还是MATLAB函数?
  • 该满足那些要求呢?哪些是你关注的重点呢?
  • 你觉得MATLAB基础知识应该分为几部分,那一部分是最重要的?

清华大学出版社近期出版了《MATLAB程序设计基础与应用》一书,是一本很实用的图书,本次活动便是以此为契机,和各位MATLAB算法爱好者就相关话题展开讨论,欢迎大家踊跃发言。

活动时间:
2016年11月1日 - 2016年11月30日

活动奖品:

《MATLAB程序设计基础与应用》刘帅奇  李会雅  赵杰  编著
书号:978-7-302-44918-8
定价:49.80元

图书试读:
《MATLAB程序设计基础与应用》前言
《MATLAB程序设计基础与应用》目录
《MATLAB程序设计基础与应用》第一章
《MATLAB程序设计基础与应用》第二章


更多书籍信息,请至《MATLAB程序设计基础与应用》版块查看。

获奖用户

3楼  wuyou136
13楼  qibbxxt
21楼  -_簡單de倖鍢
27楼  kastin
29楼  钻天鹞子
49楼  王成墨
77楼  function
75楼  绝尘敬尘
96楼   tim1893
102楼  zhoucoolqi


因为参与用户超级积极,5个名额实在很难挑选~
出版社决定追加5本奖品书籍,所以一共有10位获奖的小伙伴!
~撒花祝贺~

请获奖的各位MATLABer在两周内联系 —> 清华大学出版社,告知邮寄地址,新鲜出炉的书就会直接寄到你家~


图书购买链接:
京东
当当
亚马逊
天猫

(已经购买此书的会员请点击论坛上方【书码验证】进行验证,验证之后享受作者有问必答服务;在验证过程中遇到问题,请联系管理员)



104 条回复


matlabzhanghu 发表于 2016-11-3 18:21:47
本帖最后由 matlabzhanghu 于 2016-11-3 18:29 编辑

我更习惯用MATLAB脚本,MATLAB函数一般都是带输入需返回参数时才会用,我也看到不少是直接不带参数的函数,还没研究过。听说同样的程序,函数比脚本快些,具体原因也各有各的猜测。
我现在对matlab底层的实现比较感兴趣,比如内置函数的实现,编译过程。因为最近在做界面的过程发现,同样的代码在不同版本上不一定能顺利运行。想找出具体原因。
既然是基础知识那就应该包含一些基本的对matlab的使用及基本的运算和程序举例,还有一些简单的绘图介绍,我觉得基础知识还应该包含对matlab内部机理的介绍,几乎没有这样的书籍,导致基础不扎实,到程序规模稍大时容易出现意想不到的问题。还可以介绍一些编程经验,比如良好的编程风格和编程技巧,让新学matlab的同学少走弯路。

wuyou136 发表于 2016-11-3 18:27:18
关于脚本文件和函数文件,我现在已经完全放弃脚本文件的使用,所有程序都是在函数文件里面完成。使用函数文件有两个好处:
第一是编程效率的提高:
MATLAB 里面比较麻烦的一点就是,如果采用脚本函数编程,每次要使用一个函数,都需要新建一个 m 文件放在搜索路径,而不能像 C++ 一样,直接在一个文件里面完成。如果使用函数文件,就能够采用嵌套函数的形式,直接在同一文件写子函数:
  1. function main
  2. ...

  3. function mainFcn
  4. ...
复制代码
第二是运行效率的提高:
https://www.ilovematlab.cn/forum.php?mod=viewthread&tid=483013
比如说这个帖子的例子,在循环中申明匿名函数,使用函数文件的运行效率明显远高于脚本文件。



当然,使用函数文件最大的问题就是它会单独开辟一块工作空间,在程序运行完毕之后,workspace 当中不会保存任何变量,这可以通过以下方法解决。新建一个脚本文件,fcnEnd:
  1. %% 将所有函数工作区间变量添加到 base 区间
  2. fcnVal = who;
  3. for ii = 1:numel(fcnVal)
  4.     varLoop = fcnVal{ii};
  5.     assignin('base',varLoop,eval(varLoop));
  6. end
复制代码
这样,我们只需要在函数文件的末尾添加一句 fcnEnd 就能将变量添加到工作空间:
  1. function main
  2. ...
  3. fcnEnd
复制代码
另外,对于脚本文件习惯在开头用 clear 清除变量,在函数文件里面也可以实现同样的操作。同 fcnEnd 一样,只需要建立一个 fcnBegin 脚本放在函数开头:
  1. evalin('base','clear');
  2. close all;
复制代码
这样,我们使用函数文件时,采用以下形式,就能做到和脚本文件完全一致的功能:
  1. function main
  2. fcnBegin
  3. %%
  4. % 代码填写在此处
  5. %%
  6. fcnEnd
复制代码


最后再说一个小技巧,我们可以在输入法的个性词库当中,将:
  1. function main
  2. fcnBegin
  3. %%

  4. %%
  5. fcnEnd
复制代码
这一整段代码添加至词库,就可以通过拼写轻松输出这5行代码,使用起来相当方便。

fcnBegin.m

36 Bytes, 下载次数: 299

fcnEnd.m

159 Bytes, 下载次数: 45


Lesvas 发表于 2016-11-3 18:29:27
我基本上先写脚本 之后调试好程序之后,将功能模块打包为函数,提供调用接口 主程序来调用,可以两层的函数关系甚至是多层,最终以最少代码,最合理的逻辑作为整个程序的设计出发点…仅仅是脚本的话,比较大的项目,逻辑组织很难,仅仅是函数的话,也得有外部调用才可以…单独一方面的偏向都是不合理的…

junfeng059 发表于 2016-11-3 18:44:53
由于对matlab函数不是很熟悉,更喜欢用脚本,最近在学习使用函数提高运行效率.

清华大学出版社 发表于 2016-11-3 19:33:57
matlabzhanghu 发表于 2016-11-3 18:21
我更习惯用MATLAB脚本,MATLAB函数一般都是带输入需返回参数时才会用,我也看到不少是直接不带参数的函数, ...

很好的建议,我们会在后续出版物中采纳。

清华大学出版社 发表于 2016-11-3 19:35:59
wuyou136 发表于 2016-11-3 18:27
关于脚本文件和函数文件,我现在已经完全放弃脚本文件的使用,所有程序都是在函数文件里面完成。使用函数文 ...

例子很好额,欢迎多多发表见解。

HUOYING 发表于 2016-11-4 10:19:29
毕业了就没有来过论坛了,微博居然给推荐了,才发现老账号都给清空了(可惜),个人的话还是喜欢脚本,毕竟大多数时候只是为了解决当前的问题,并不需要保留输入输出参数的函数,自然,MATLAB自带的函数有很多可用的,很给力

深蓝孩童 发表于 2016-11-4 11:25:28
现在脚本文件和.mlx文件都可以附带函数了,很方便,所以现在实现简单的功能肯定是在脚本文件中编写,附属功能用脚本内函数实现。
单纯使用函数文件,文件太多,好乱。

good2528 发表于 2016-11-4 11:26:07
按需要来。
如果需要检查各个变量的信息,就会选择脚本文件,这样方便查错,函数报错再检查只有输入和输出不会出现中间变量。运行脚本文件检查方便,可以根据中间步骤产生的变量知道具体是哪一步出的问题。
函数的话主要在程序已经没有太大的问题,只有固定的输入需要变化,这个时候就会选择函数,这个时候函数的好处就是直接代用函数就可以了,而脚本文件还需要对脚本进行修改。

qibbxxt 发表于 2016-11-4 11:32:19
以前当然是脚本和函数同时使用

现在新的版本,在脚本里面可以写函数了,那肯定是用脚本了,一个文件,全部搞定

killfith 发表于 2016-11-4 11:35:21
我一般用函数吧,脚本不习惯使用。对于matlab,我主要是用来做图像处理的,希望实例多点丰富各种不同的类型,部分的话现在书籍分的都不错,就是希望可以多些例子

qibbxxt 发表于 2016-11-4 12:27:53
本帖最后由 qibbxxt 于 2016-11-4 12:30 编辑
wuyou136 发表于 2016-11-3 18:27
关于脚本文件和函数文件,我现在已经完全放弃脚本文件的使用,所有程序都是在函数文件里面完成。使用函数文 ...

先不说最近的版本,函数可以写在脚本文件里面。

一般来说,主程序应该是脚本文件,其余的可以写成函数文件,便于重复调用,如果子文件太多,可以建立一个文件夹,或者采用类来封装,或者是用参数返回函数文件中子函数的句柄来实现调用等方式

函数文件的目的就是不把内部变量暴漏,需要的变量通过接口去访问, 而采用assignin等函数跨空间去导出变量,不但失去了函数的意义,而且也造成了性能的下降

因此非常不建议这种做法, 无论如何,新的版本这些都不是问题,一个文件全部搞定
另外对于你说的关于脚本和函数效率的问题,不能通过一个例子来片面的说明问题,MATLAB的执行效率由于环境,调用方式等不同,差别较大,很难说的清楚

wuyou136 发表于 2016-11-4 16:25:38
qibbxxt 发表于 2016-11-4 12:27
先不说最近的版本,函数可以写在脚本文件里面。

一般来说,主程序应该是脚本文件,其余的可以写成函数文 ...

你好,一直记得你的 ID,刚学 MATLAB 的时候还是看到你的回答才觉得 MATLAB 矩阵运算这么震撼
https://www.ilovematlab.cn/thread-307308-1-1.html

我刚看了 MATLAB 2016b 的更新信息,的确是能够在脚本中定义本地函数了,这是个很赞的功能,有这个功能的话完全可以不用我说的那种采用嵌套函数再利用 assignin 导入到 base 空间的方法。

不过在之前的版本,我还是比较坚持用嵌套函数的形式去替代脚本文件。首先你说的写成函数文件或者用类来封装,这个我很赞同,尤其是对于比较大型程序或者函数文件需要重用的话,这么做的好处毋庸置疑。但是很多时候只是为了用 MATLAB 去验证某个算法,写的函数用了这一次之后就不再需要了,这时能够写入到一个文件当中的话,对于调试和修改都是很方便的,也不用后续再去删除文件。我觉得新版本支持在脚本文件中定义本地函数也是出于这个考虑。

你说的函数文件的目的就是不把内部变量暴露,其实我的那种方法只是把第一个主函数的变量用 assignin 导入到 base 空间,它的用法就和新版本在脚本中定义本地函数的用法一模一样,在文件内部定义的本地函数依旧只是提供一个接口,仍然可以很好的实现模块化。至于用 assignin 会造成性能的下降,assignin 这个函数的效率是非常高的,就目前来说,我测试过的所有代码, 函数文件+assignin 的效率都是要高于或等于 脚本文件 的效率,因此我才会说用函数文件的运行效率会更高。所以效率问题也是不用担心的。

zbdayao 发表于 2016-11-4 20:55:53
由于对matlab的各种函数不是很熟悉,更喜欢用脚本

任忍 发表于 2016-11-4 21:06:24
大型文件还是喜欢使用函数,封装好了互相调用方便。
脚本一般是子模块搭建的时候使用--。
不过还是函数用的多
基础知识还是循环部分好好讲讲吧,以及向量化编程,简化循环比较方便

qibbxxt 发表于 2016-11-4 22:09:38
wuyou136 发表于 2016-11-4 16:25
你好,一直记得你的 ID,刚学 MATLAB 的时候还是看到你的回答才觉得 MATLAB 矩阵运算这么震撼
...

Matlab变量共享的方式有多种,嵌套函数无疑是一个不错的选择,尤其是在GUI编程的时候。

我的意思是主函数采用脚本,其他的采用函数文件的形式

assignin等函数有一定的风险可能覆盖base空间的同名变量,另外看到你的程序里面用到了eval,如果你要说eval函数的效率高的话,那我肯定是不能赞同的,你可以去测试测试eval函数的效率

刚才看了3年前的帖子,这几年我的精力主要花在cody上,如果你还没有玩过cody的话,建议你有空可以去那里玩玩,相信会是一个更大的平台

wuyou136 发表于 2016-11-4 22:31:15
qibbxxt 发表于 2016-11-4 22:09
Matlab变量共享的方式有多种,嵌套函数无疑是一个不错的选择,尤其是在GUI编程的时候。

我的意思是主函 ...

谢谢,最近逛论坛的时间也越来越少了

我理解你的意思,就是我前面用的 函数文件+assignin 方法,可以说和新版本的 脚本文件+本地函数 用法是完全一致,它就相当于是一个脚本文件,对于变量的操作也相当于是直接在 base 空间上操作。开头的:
  1. evalin('base','clear');
复制代码

清除的也是 base 空间的变量,所以变量覆盖这件事也是不需要担心的。
另外,eval 这个函数,缺点是一大堆,我还专门写过一篇文章介绍了如何避免使用这个函数(生成一系列有规律名变量):
https://www.ilovematlab.cn/article-63-1.html
但是在这里,eval 所带来的低效率是完全可以忽略的,因此循环次数较小,并且它这里的作用只是将一个变量名字符串翻译成语句,所以效率没有问题,我测试过很多代码了,大部分代码 函数文件+assignin 的效率与脚本文件效率不相上下,有些特例 函数文件+assignin 执行效率是要远高于 脚本文件 的。

qibbxxt 发表于 2016-11-5 15:54:13
wuyou136 发表于 2016-11-4 22:31
谢谢,最近逛论坛的时间也越来越少了

我理解你的意思,就是我前面用的 函数文件+assignin 方法,可以 ...

刚看了你的那个帖子,关于浮点数的误差的解释,似乎不对,你查阅查阅资料,再看看?

paioc 发表于 2016-11-5 20:39:25
你更习惯用MATLAB脚本还是MATLAB函数,其实我不分,还在学习中,我只希望有书

-_簡單de倖鍢 发表于 2016-11-5 22:57:36
本帖最后由 -_簡單de倖鍢 于 2016-11-5 23:00 编辑

没错,是冲着书来的,哈哈哈~

且不说本科研究生期间学的用的,单单6个月的超高强度的公司项目经验确实让我重新认识了MATLAB,体会的也更加深刻,应该也算有发言权吧。


我个人更倾向于喜欢用脚本文件,原因很简单,当我们遇到的问题越来越复杂的时候,MATLAB函数本身是无法满足我们的需求的,我要研究新算法或者对原有的算法进行改进,那么在了解MATLAB的优势劣势的同时还能按照自己的想法编出来做成自己的函数库自然是很便利的,随用随取随时优化完善,慢慢的自己的编码能力也提升了,考虑的也越来越周全,这也是一种做事能力的提升。另外,我想说的是,如果MATLAB把自身封装的函数的原理写的再详细一些而不是泛泛一提,那么对于我们后期的算法改进以及自行编写就会方便很多,这应该也是多数做算法研究的所看重的吧。

关于第三个问题,MATLAB的基础知识应该分为几部分那一部分最重要,其实我想说,几部分只是排版问题,我个人可能 不太看重这个部分的数字,而更关注其中的内容,如果是推向MATLAB初级受众人员的话,个人觉得MATLAB是做什么的?为什么要用MATLAB,MATLAB的优势在哪劣势在哪,这块首先要向该批读者说明,首先有个大概了解,知其所以然才能用的更方便嘛。另外,MATLAB可以实现的大概功能以及应用领域也有必要告知下,一是告知下让大家开阔下眼界,也算是展示下MATLAB的强大嘛,另外对于MATLAB入门级来说,首先是要会用这款软件,基本的MATLAB函数介绍也是必要的,MATLAB版本的功能键这些傻瓜式的操作首先要会的,也算是告诉读者MATLAB不难,不怕,再加上前边介绍的一些好玩的高大上的领域应用,兴趣+自信有了,基本可以大胆尝试了,然后可以慢慢渗入一些灵活的编写技巧,自己如何写函数如何调试如何调用,摆脱MATLAB函数的束缚,随心所欲的去编写,随心所欲的去实现自己想要的功能,外加help或者mathworks和matlab中文论坛里的各种算法讲解,那么用MATLAB实现算法研究算法基本已经不是太难了,更不会吓到大家~大家也就越来越喜欢matlab编程实现了~这样的良性循环是我们做学术研究算法的福音,对mathworks也是长远的可观的利益~


以上就是我个人对MATLAB的一些理解和认识,不权威也不全面,大家见笑了~~
我现在是习惯了MATLAB的编程思维,喜欢上了这款软件,很强大哦~期待越来越好哦~~~


P.S. 抽到我啊,书书书,我要书~~~~please~~~~~~~~~~~~


qibbxxt 发表于 2016-11-5 23:25:07
-_簡單de倖鍢 发表于 2016-11-5 22:57
没错,是冲着书来的,哈哈哈~

且不说本科研究生期间学的用的,单单6个月的超高强度的公司项目经验确实让我 ...

感觉你对为什么喜欢脚本的文件的原因没有说清楚,反而是一些方法论的东西

小巫达人 发表于 2016-11-6 02:27:43
我用MATLAB做了个比较复杂的系统,应该说主要是用函数完成的,因为涉及到太多的小算法程序,放进一个脚本以及难以管理,分散成众多的哈数文件可以随时对其中任意不满意的进行删改。倒是脚本我是在调试的时候用来模拟数据输入时候才用到,16以后有脚本的实时功能我还没习惯用,应该是一个很不错的东西。

hmh1991 发表于 2016-11-6 15:57:18
MATLAB函数不是很清楚,但是MATLAB脚本还是用的比较多的。MATLAB不愧是数学科研的三剑客。

江海小舟 发表于 2016-11-6 20:27:12
目前在使用Matlab的时候,大都还是使用脚本,因为在对函数的参数传递熟悉之前,脚本文件可以更加方便程序调试,能够将结果一步步反映。也能更好理解结果的产生过程及在对中间变量调出时也方便。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表