前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Matlab系列之脚本与函数M文件与函数句柄

Matlab系列之脚本与函数M文件与函数句柄

作者头像
狂人V
发布2020-07-14 16:42:59
1.4K0
发布2020-07-14 16:42:59
举报
文章被收录于专栏:电子狂人电子狂人

从Matlab篇章的开始到现在,已经讲了一些操作的基础知识,其实和很多语言都有一定的相似之处,接下来几篇打算分享一下关于Matlab编程的一些基础。

~Show Time~

首先再回顾一下开篇时说到的M文件,分为脚本M文件和函数M文件这两种,其中函数一般包含输入和输出变量,函数运行时使用传递给它的变量然后返回最终的计算结果给输出变量,在这运行的过程中,函数内所产生的变量都只临时存在于函数自己的一个工作区中,当函数运行完成后就会消失;而脚本文件则不包含输入和输出变量,直接运行用于实现特定的功能,通常由M代码与其注释组成。

函数M文件正式的第一行以function开始,开始建立一个函数,最终以end结束其运行,

例如:function [y1,...,yN] = my_function(x1,...,xM)

这部分就相当于定义了一个叫做my_function的函数,有M个输入变量,N个输出变量,函数名必须以字母开头,之后可以由字母、数字或者下划线组成,但是不能超过规定长度(63个字符),不然会被系统忽略掉多余的部分,可以用isvarname函数进行函数名有效性检查,不过我想一般也没什么人会需要搞那么长的一个名字吧。

函数当然也可以是没有输入或者输出变量,如果输出变量没有,可以不写中括号,也可以使用空的中括号。

如:function myfun(x1)

或者function [] = myfun(x1)

不知道看到这,有没有想过调用的时候也可以少给甚至不给输入或输出变量呢?这个就大家自己实际了,不过可以很肯定的告诉你,如果多于定义的变量数是肯定不能的,会返回error

接下来对脚本M文件和函数M文件进行一个简单的演示:

先直接点击新建>>脚本

然后在弹出的Untitled文件下进行程序编写,并保存,然后命名为“petal.m”,再运行程序,关于程序的具体代码分析就不多说了,这边主要是演示一下脚本M文件的效果。

代码语言:javascript
复制
%petal.m
theta=-pi:0.01:pi;
rho(1,:)=2*sin(5*theta).^2;
rho(2,:)=cos(10*theta).^3;
rho(3,:)=sin(theta).^2;
rho(4,:)=5*cos(3.5*theta).^3;
for k=1:4
    polar(theta,rho(k,:))
    pause
end

点击运行后,在弹出的Figure界面按任意键,Figure中的图片会进行切换,就是代码那个for里面pause的作用,然后切换四次后再按就会返回命令窗口行的界面。

看下四种图,分别代表的就是rho四行数据所得的极坐标图形。

接下来演示下函数的创建与使用,创建可以直接新建>>函数,也可以新建>>脚本,然后在出现的界面编写代码时按照函数的格式进行设计即可。

随便哪种形式所得的函数文件,都要注意文件名要和函数名一致,不然调用不起,看下演示的程序:

function y=average(x)

y=sum(x)/length(x);

end

直接看名字,估计你也猜出来了,就是求取一串数字的平均值,将函数M文件正确保存好之后,在命令行窗口来进行调用函数看看效果,调用方法就是先产生一个固定的数组,然后对该数组求平均

Num=1:199;average(Num)

本篇关于M文件的两种形式到此就结束了,在使用的时候,一定要注意路径的问题,还有就是函数名和文件名要保持一致,脚本文件名就比较随意,但是为了方便记忆或者分类,最好还是按照功能或者特定的规律进行命名,之后工程弄大了,也可以很快的定位到特定的文件。

你以为结束了吗?并没有

在上一篇讲运算符和标点符号时,说到的“@”对应的函数句柄,不知道你们是否遇到过或者使用过,接下来将简单对它做个介绍,希望你可以Get!

句柄也就是经常看到报错时出现的(handle),虽然不知道你们遇到过没,但是我经常遇到

,它是MATLAB的标准数据类型之一,利用函数句柄可以实现对函数的间接调用,可以通过函数句柄传递给其他函数实现对函数的操作,也可以将函数句柄保存在变量中,创建的方式就是使用艾特符号,具体操作如下:

代码语言:javascript
复制
myhandle = @functionname

其中functionname就是要包含的函数名,myhandle就是为该函数创建的句柄,关于调用,理解也很简单,操作:

代码语言:javascript
复制
myhandle(arg1,arg2,...,argN)%myhandle为函数句柄,N个输入变量

除了这样的基本操作外,还有一种是以匿名函数的方式进行创建,具体操作:

代码语言:javascript
复制
myhandle = @(arglist)expr

其中expr是一个函数体,arglist是输入变量列表,可以用逗号分隔开,举个简单的例子:

代码语言:javascript
复制
myhandle = @(x)x.^2

就相当于创建了一个计算输入变量x平方的匿名函数,演示结果如下:

若输入的变量为空,则arglist对应的位置就是空的,如:

代码语言:javascript
复制
myhandle = @()datestr(now)

相当于将当前的时间转化为字符串然后进行显示,操作如下:

还有一种操作,就是将多个函数句柄弄在一起进行操作,不知道有没有想起单元数组,也就是那个强大的cell,看例子:

代码语言:javascript
复制
TrigFun={@sin,@cos,@tan}

使用花括号直接组合成单元数组的形式,然后其句柄的调用举例:

代码语言:javascript
复制
plot(TrigFun{3}(-pi:0.01:pi))

相当于使用了@tan,然后对结果进行绘图。

结果:

今天的分享到此结束,下一篇打算搞一个理解起来可能会有点晕的东西,但是理解了应该就觉得So Easy,敬请期待吧!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 电子狂人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云代码分析
腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档