主要内容

为用于验证输入和输出参量的 arguments 代码块生成代码

您可以为在 MATLAB® 函数中执行输入和输出参量验证的 arguments 代码块生成代码。使用参量验证,您可以约束函数输入和输出值的类、大小以及其他方面,而无需在函数体中编写代码来执行这些测试。请参阅函数参量验证

如果您在 MATLAB 入口函数中使用 arguments 代码块验证函数输入参量,也可以使用 arguments 代码块指定代码生成的输入类型,但有一定的限制。请参阅Use Function Argument Validation to Specify Entry-Point Input Types (MATLAB Coder)

Pseudocode snippet demonstrating the syntax of the arguments block

支持的功能

代码生成支持 arguments 代码块的大多数功能,包括大小和类验证、验证函数和默认值。代码生成还支持 namedargs2cell 函数。

代码生成不支持 arguments 代码块的以下功能:

  • 重复参量的大小验证、类验证和验证函数

  • 多个重复输入参量

  • 入口函数的名称-值输入参量

  • tabletimetable 对象的大小验证。

名称必须为编译时常量

假设 foo 是使用名称-值参量验证的函数。当您从另一个函数 bar 调用 foo 时,代码生成器必须能够确定您在编译时提供给 foo 的名称。

例如,入口函数 myNamedArg_valid 的代码生成会成功。此函数包含对函数 local 的两次调用。对于这两个调用,参量名称 'x' 在代码生成期间是已知的。

function [out1,out2] = myNamedArg_valid(in1,in2)
out1 = local(x=in1);
out2 = local('x',in2);
end

function out = local(args)
arguments
    args.x
end

out = args.x;
end
codegen myNamedArg_valid -args {0,0}
Code generation successful.

相反,入口函数 myNamedArg_invalid 的代码生成会失败,因为函数 local 的参量名称是在运行时提供的。

function out = myNamedArg_invalid(value, inputName)
out = local(inputName, value);
end

function out = local(args)
arguments
    args.x
end

out = args.x;
end
codegen myNamedArg_invalid -args {0,coder.typeof('a')}

Error calling 'myNamedArg_invalid/local'.This call-site passes more inputs to this function than it can accept.This is likely caused by:This argument is not constant, and therefore does not match against a name-value argument inside 'myNamedArg_invalid/local' during code generation.Code generation might fail or produce results that do not agree with MATLAB if a name passed at a call site is not known during code generation.(调用 'myNamedArg_invalid/local' 时出错。此调用点传递给此函数的输入数超出它可以接受的数量。这可能是由以下原因引起的: 此参量不是常量,因此在代码生成过程中无法匹配 'myNamedArg_invalid/local' 内部的名称-值参量。如果在代码生成期间不知道在调用点处传递的名称,代码生成可能会失败或生成与 MATLAB 不一致的结果。)

在某些情况下,代码生成器会将您传递的名称赋给可选的位置或重复输入参量。在这种情况下,虽然能成功生成代码,但会出现警告,生成的代码可能会产生与 MATLAB 执行不同的结果。请参阅在运行时传递输入参量名称 (MATLAB Coder)

使用保留名称-值参量的结构体

假设您打算为其生成代码的 MATLAB 函数使用名为 NameValueArgs 的结构体来定义两个名称-值参量,即 Name1Name2

function result = myFunction(NameValueArgs)
    arguments
        NameValueArgs.Name1
        NameValueArgs.Name2
    end
    ...
end

在函数体中,直接使用结构体字段 NameValueArgs.Name1NameValueArgs.Name2 来读取或写入数据。

不要使用整个结构体变量 NameValueArgs 本身(没有圆点语法),除非在以下情况下:

  • 使用 isfield 函数检查调用方是否为某个名称-值参量提供了值。例如,要在 arguments 代码块之外为 NameValueArgs.Name2 提供默认值,可以使用以下代码片段:

    if ~isfield(NameValueArgs,'Name2')
        NameValueArgs.Name2 = defaultValue;
    end
  • 使用 namedargs2cell 函数将名称-值参量转发给另一个函数。例如:

    argsCell = namedargs2cell(NameValueArgs);
    foo(argsCell{:});

循环、匿名函数或嵌套函数中不支持使用整个结构体变量 NameValueArgs(包括上述两种特殊情况)。

生成的代码和 MATLAB 代码之间的差异

某些不常见的代码模式可能导致为参量验证生成的代码的行为与 MATLAB 不同。要了解其中的一些差异,请访问以下链接:

另请参阅

主题