MATLAB 中的函数参数验证

2025年7月25日 | 阅读7分钟

引言

MATLAB 函数中使用的参数通常是输入参数,它们决定了函数处理的性质和模式。函数参数验证可以确保在函数继续执行之前,这些输入符合预设的条件。由于对函数没有进行检查和平衡,输入类型、大小或值可能不正确或出乎意料,这意味着以这种方式运行的任务可能会出错或产生不正确的结果。

函数参数检查是指根据可接受的类型、大小、可能的值或定义函数参数可接受性的任何特征,来验证传递给函数的参数是否在某些可接受的参数集内。因此,当提供了输入参数时,函数就可以正常、无风险地工作。

验证的重要性

  • 防止错误:这常常导致运行时错误、程序失败和崩溃或显示错误的结果。
  • 确保数据完整性:同样,结构体可能会存储错误的数据,并且可能由于函数中的此类结构体接收到不正确的信息而直接导致错误的输出。
  • 提高代码的健壮性:通过消除潜在的错误,函数在实际场景中会更有用,因为所有参数都必须在函数开头进行验证。
  • 增强用户体验:仅就错误报告而言,正确的验证可确保返回给用户的消息易于理解,以便可以尽快纠正输入过程中发生的错误。

无验证的常见问题

  • 输入类型不正确:如果函数需要特定类型的数据,而程序以不兼容的形式将数据提供给函数,则程序可能会给出错误的结果,甚至可能无法响应。例如,当尝试对字符串执行算术运算时,该变量将导致错误。

示例

  • 大小或维度不匹配:函数还期望其输入具有特定的维度,例如行向量、列向量或矩阵。如果不对这些大小约束进行控制,函数可能会尝试处理大小不正确的数据,因此可能导致错误或不正确的结果。

示例

  • 无效值或超出范围的输入:某些应用程序可能对特定输入值有限制,例如正值、非零值、分类值等。如果函数未收到验证,它可能会处理不想要的数据,或者最多会产生错误的结果。

示例

  • 意外的副作用:当函数收到错误的参数时,它们可能会执行不希望的操作或产生影响程序其他部分的副作用。例如,更改全局变量的值或破坏数据结构。

示例

MATLAB 中内置的参数验证方法

1. 输入解析器 (inputParser)

MATLAB 中用于参数验证和解析的内置功能是 inputParser 类,它允许用户充分测试参数列表以获取预期的输入,并在需要时将其转换为可接受的形式。它允许您处理可选参数、设置默认值以及检查输入类型、大小和条件,而无需编写繁琐的逻辑。

要使用 inputParser,请按照以下步骤操作

  • 使用 inputParser 对象。
  • 包括必需参数以及可选参数和名称-值对参数。
  • 确定关键的验证函数或属性检查。
  • 输入处理:这包括分析输入和可能的错误。

示例

以下是如何使用 inputParser 来确定函数输入参数何时有效

2. validateattributes 函数

validateattributes 函数因此而设计,用于检查输入参数是否具有正确的类型、大小和/或值范围。此函数通过将输入参数的属性与某些预定条件进行比较来检查输入参数的属性,并在可能的情况下建议错误。

该函数可以验证

  • 类型:支持输入指定类(整数、字符、因子等)。
  • 大小:确保或查询给定输入或变量的大小,例如向量、矩阵或标量。
  • 值范围:检查参数的值是否属于特定类型且在特定范围内(例如,值应介于 0 和 10 之间)。

示例

以下示例使用 validateattributes 函数检查具有类型、大小和值限制的数值参数

3. 自定义验证函数

当内部验证方法不足或过于宽泛时,您可以开发自己的验证函数。这些用户定义的函数可以帮助您定义更可靠的验证规则,例如验证复杂的逻辑谓词、匹配模式或基于其他数据集的验证器等。

要创建自定义验证函数

  • 创建一个函数,该函数接受一个输入并返回一个布尔值(当输入有效时)和一个错误值(当输入无效时)。
  • 在主函数(使用输入解析器或其他方式)的输入检查部分应用此函数。

示例

以下是如何构建一个验证函数来检查一个数字是否为质数

MATLAB 中验证标准的类型

1. 类型检查

类型检查用于验证输入参数的特性,即它们是数值数组、字符还是元胞数组。这实际上是最不重要的验证之一,通常被大多数开发人员所忽略,但它可能至关重要,因为使用错误的数据类型可能会导致应用程序行为不正确或引发异常。

示例

检查输入是否为数值

MATLAB 类型检查函数

  • isnumeric:检查输入是否为数值类型。
  • ischar:检查输入是否为字符数组。
  • iscell:检查输入是否为元胞数组。
  • islogical:检查输入是否为逻辑数组。
  • isstruct:检查输入是否为结构体。

2. 大小和形状验证

大小和形状验证部分还确保输入参数的大小或数组形状与特定大小或形状匹配。当函数预期输入具有特定维度(例如,矩阵或向量)时,这一点很重要。

示例

检查输入是否为行向量

MATLAB 大小检查函数

  • size:返回输入数组的大小。
  • length:返回数组最大维度的长度。
  • isvector:检查输入是否为向量(行向量或列向量)。
  • ismatrix:检查输入是否为矩阵(二维数组)。
  • ndims:返回输入维度的数量。

3. 值范围检查

值范围检查是检查提供的值是否在范围内的一个过程。这对于确保某些操作的输入值的有效性和实用性特别有用,例如确定某个操作的索引是否在数组内,或者某些操作的数量是否在给定范围内。

示例

检查输入值是否为正数

MATLAB 范围检查函数

  • min:返回数组中的最小值。
  • max:返回数组中的最大值。
  • all:检查数组的所有元素是否满足某个条件。
  • any:检查数组的任何元素是否满足某个条件。
  • between:一个自定义函数,用于检查值是否在指定范围内。

4. 自定义条件

对于您的情况,需要更复杂的验证条件,不仅包括输入的类型和大小,还包括输入的值,您可以使用自定义条件。当需要根据标准验证工具无法覆盖的逻辑或数学条件集来检查输入时,此类验证就非常有用。

示例

检查输入数字是否为质数

自定义逻辑条件

通过这种方式,可以组合多个逻辑检查集来形成更复杂的条件。