为用于验证输入和输出参量的 arguments
代码块生成代码
您可以为在 MATLAB® 函数中执行输入和输出参量验证的 arguments
代码块生成代码。使用参量验证,您可以约束函数输入和输出值的类、大小以及其他方面,而无需在函数体中编写代码来执行这些测试。请参阅函数参量验证。
如果您在 MATLAB 入口函数中使用 arguments
代码块验证函数输入参量,也可以使用 arguments
代码块指定代码生成的输入类型,但有一定的限制。请参阅Use Function Argument Validation to Specify Entry-Point Input Types (MATLAB Coder)。
支持的功能
代码生成支持 arguments
代码块的大多数功能,包括大小和类验证、验证函数和默认值。代码生成还支持 namedargs2cell
函数。
代码生成不支持 arguments
代码块的以下功能:
名称必须为编译时常量
假设 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
的结构体来定义两个名称-值参量,即 Name1
和 Name2
:
function result = myFunction(NameValueArgs) arguments NameValueArgs.Name1 NameValueArgs.Name2 end ... end
在函数体中,直接使用结构体字段 NameValueArgs.Name1
和 NameValueArgs.Name2
来读取或写入数据。
不要使用整个结构体变量 NameValueArgs
本身(没有圆点语法),除非在以下情况下:
使用
isfield
函数检查调用方是否为某个名称-值参量提供了值。例如,要在arguments
代码块之外为NameValueArgs.Name2
提供默认值,可以使用以下代码片段:if ~isfield(NameValueArgs,'Name2') NameValueArgs.Name2 = defaultValue; end
使用
namedargs2cell
函数将名称-值参量转发给另一个函数。例如:argsCell = namedargs2cell(NameValueArgs); foo(argsCell{:});
循环、匿名函数或嵌套函数中不支持使用整个结构体变量 NameValueArgs
(包括上述两种特殊情况)。
生成的代码和 MATLAB 代码之间的差异
某些不常见的代码模式可能导致为参量验证生成的代码的行为与 MATLAB 不同。要了解其中的一些差异,请访问以下链接:
空的重复输入参量 (MATLAB Coder)
在运行时传递输入参量名称 (MATLAB Coder)
有条件赋值的输出的输出参量验证 (MATLAB Coder)