跳转到内容

MATLAB 编程/脚本

来自维基教科书,开放的书籍,开放的世界


有两种类型的 M 文件

  • 脚本
  • 函数

脚本是 M 文件的一种类型,它在当前工作空间中运行。因此,如果您从命令行(基本工作空间)调用脚本,该脚本将使用和操作基本工作空间的变量。这会变得非常混乱,并在循环涉及时以及编码器懒于命名其循环变量(例如,对于 i = 1:10,如果每个循环都使用 i、j 或 k,那么很可能从循环调用的任何脚本都会改变循环变量)。

函数完全包含在自身中。它们拥有自己的工作空间,保持工作空间分离。这意味着特定函数所需的所有变量都必须以某种方式传递或定义。对于需要大量变量的复杂算法来说,这可能很乏味。但是,当函数退出时,对变量的所有操作都会被丢弃。只有函数提供的那些输出参数可用于调用工作空间。这意味着循环可以使用 i、j 或 k 随意,因为函数的工作空间和调用工作空间不会混淆。

任何在命令行有效的命令在任何 M 文件中都有效,只要 M 文件的操作工作空间中存在必要的变量。

正确使用函数可以对任何算法或绘图工具进行任何更改。这允许自动化重复性任务。

在 M 文件末尾使用 'end' 是可选的;但是,这样做如果代码中有条件语句或循环,或者如果计划在同一个文件中使用多个函数,可能会导致复杂情况(有关此内容的详细信息,请参阅嵌套函数)。

函数的要求

[编辑 | 编辑源代码]

自定义函数以其最基本的形式遵循以下语法

function [output1, output2, ...]= function_name(input_arg1,input_arg2)
        statements
return;

在当前版本的 MATLAB 中,return; 行不是必需的。function_name 可以是您喜欢的任何名称,但最好是 M 文件的名称为 function_name.m。从命令行或另一个 M 文件调用该函数是通过使用函数的 M 文件名以及必要的输入和输出参数来完成的。

在函数本身内,必须有一个语句来定义每个输出参数(output1、output2 等)。如果没有一些声明,输出参数的变量在函数的工作空间中不存在。这会导致关于“一个或多个输出参数”的错误。在函数开始时初始化输出参数是一个好习惯。

通常,输出参数被初始化为空 ([]) 或 0 或 -1 或其他数据类型的等效值。原因是,如果函数遇到预期的错误,则函数可以返回(通过 return 命令)这些默认值。如果初始化值是无效值,那么调用函数可以轻松地检查任何可能不会抛出 MATLAB 错误的错误。

为了调用函数,该函数的 M 文件必须在当前路径中。可以通过文件菜单或 addpath 命令设置一个默认路径。路径的顺序很重要,因为 MATLAB 按顺序搜索路径并在找到该 M 文件名的第一个实例后停止搜索。

当前路径是

  • 当前目录(可以在 MATLAB 窗口顶部看到或通过在命令提示符下键入 pwd 来查看)
  • 默认路径

请注意,MATLAB 始终在搜索任何其他路径之前搜索当前目录。

nargin & nargout

[编辑 | 编辑源代码]

narginnargout 命令仅在函数内部有效,因为脚本不会传递任何参数。nargin 命令返回传递的输入参数的数量。这与 nargchk 结合使用非常有用

 nargchk(min, max, nargin)

其中 min 是函数运行所需的最小参数数量,max 是有效输入参数的最大数量。

nargout 命令用于确定要返回的输出参数。通常,输出是某些算法的最终结果,并且很容易计算。但是,在某些情况下,次要输出参数可能很耗时才能计算出来,或者需要比主要输出参数更多的输入参数。因此,函数可以通过 nargout 命令检查请求的输出参数的数量。如果调用者没有保存次要输出参数,那么就不需要计算它们。

varargin & varargout

[编辑 | 编辑源代码]

使用 MATLAB 对象和函数时,它们通常允许用户设置属性。函数和对象附带了这些属性的默认值,但用户可以覆盖这些默认值。这是通过使用 varargin 来实现的。varargin 是一个元胞数组,通常在 varargin{i} 是一个属性,varargin{i+1} 是用户希望该属性的值的情况下进行解析。解析是使用 forwhile 循环和 switch 语句完成的。

 function [out] = myFunc(in, varargin)

varargout 输出参数选项允许可变数量的输出参数,就像 varargin 允许可变数量的输入参数一样。从MATLAB 网站

 function [s,varargout] = mysize(x)
 nout = max(nargout,1)-1;
 s = size(x);
 for k=1:nout, varargout(k) = {s(k)}; end

返回大小向量,以及可选的单个大小。因此

 [s,rows,cols] = mysize(rand(4,5));

返回 s = [4 5],rows = 4,cols = 5。

有用的语法指南

[编辑 | 编辑源代码]

在每行代码后放置分号符号告诉编译器不要将该行代码放在命令提示符中,然后执行。这可以使您的程序运行得更快。此外,在每行代码后放置分号有助于调试过程。

syms x y z;
w=[x y z];
e=[1 2 3];
t=jacobian(e,w);

在代码中放置注释可以帮助其他人(以及您自己)理解代码变得越来越复杂时的代码。

syms x y z;                 %syms command makes x y and z symbolic
w=[x y z];
e=[1 2 3];
t=jacobian(e,w);

注释还可以识别谁编写了代码以及他们何时编写了代码。

%Some code writer
%mm/dd/yyyy 

有关此内容的更多详细信息,请参阅“注释”部分。

嵌套函数

[编辑 | 编辑源代码]
Clipboard

待办
编写有关嵌套函数的内容,包括它们的优缺点


[编辑 | 编辑源代码]

本页面大部分内容来自ControlTheoryPro.com 的 M 文件页面脚本,以及函数

华夏公益教科书