定义 System object 的技巧
System object™ 是一种专用的 MATLAB® 对象,针对迭代处理进行了优化。当您需要多次运行某个对象或循环处理数据时,可使用 System object。定义您自己的 System object 时,请按照以下建议帮助您的 System object 更快地运行。
常规
在
setupImpl方法中定义所有一次性计算,并将结果缓存在私有属性中。对重复的计算使用stepImpl方法。分别使用
true或false而不是1或0来指定布尔值。如果某个方法中的变量不需要在两次调用之间保留其值,请对该方法中的这些变量使用局部作用域。
输入和输出
有些方法使用
stepImpl算法输入作为输入,例如setupImpl、updateImpl、validateInputsImpl、isInputDirectFeedThroughImpl和processInputSpecificationChangeImpl。这些输入必须与stepImpl的输入顺序匹配,但不需要与输入数目匹配。如果您的实现不需要为 System object 提供任何输入,则可以将它们全部关闭。对于
getNumInputsImpl和getNumOutputsImpl方法,如果您从某个对象属性设置返回参量,则该对象属性必须具有Nontunable特性。
在方法定义中使用 ~ 作为输入参量
所有方法(静态方法除外)都期望将 System object 句柄作为第一个输入参量。您可以对 System object 句柄使用任何名称。由 MATLAB 编辑器菜单插入的代码使用 obj。
在许多示例中,使用 ~ 来指示函数中未使用对象句柄,而不是传入对象句柄。使用 ~ 而不是对象句柄可防止出现有关未使用的变量的警告。
属性
对于不会更改的属性,请将它们定义为
Nontunable属性。Tunable属性比Nontunable属性的访问时间慢。只要有可能,尽量对属性使用
protected或private特性,而不要使用public特性。某些public属性比protected和private属性的访问时间慢。如果在
stepImpl方法中多次访问了属性,请将这些属性以局部变量的方式缓存在该方法中。多次属性访问的典型示例为循环。使用缓存的局部变量的迭代计算的运行速度比必须访问对象属性的计算快。当此方法的计算完成后,您可以将本地缓存的结果重新保存到该 System object 的属性中。将经常使用的可调属性复制到私有属性中。该最佳做法也适用于updateImpl和outputImpl方法。例如,在下面的代码中,
k在每次循环迭代中被多次访问,但只有一次保存到对象属性中。function y = stepImpl(obj,x) k = obj.MyProp; for p=1:100 y = k * x; k = k + 0.1; end obj.MyProp = k; end
属性的默认值在对象的所有实例之间共享。一个类的两个实例可以访问同一个默认值(如果该属性尚未被任何一个实例覆盖)。
文本比较
不要在 stepImpl 方法中使用字符向量比较或基于字符向量的 switch 语句,而应在 setupImpl 中创建一个方法句柄。此句柄指向同一类定义文件中的方法。在 stepImpl 的循环中使用该句柄。
此示例说明如何在循环中使用方法句柄和缓存的局部变量,以实现一个高效的对象。在 setupImpl 中,根据字符向量比较选择 myMethod1 或 myMethod2,然后将方法句柄赋给 pMethodHandle 属性。由于 stepImpl 中存在一个循环,因此请将 pMethodHandle 属性赋给本地方法句柄 myFun,然后在该循环中使用 myFun。
classdef MyClass < matlab.System function setupImpl(obj) if strcmp(obj.Method, 'Method1') obj.pMethodHandle = @myMethod1; else obj.pMethodHandle = @myMethod2; end end function y = stepImpl(obj,x) myFun = obj.pMethodHandle; for p=1:1000 y = myFun(obj,x) end end end function y = myMethod1(x) y = x+1; end function y = myMethod2(x) y = x-1; end end
Simulink
对于要包含在 Simulink 中的 System object,请添加 StrictDefaults 属性。该属性将所有 MutableImpl 方法设置为默认返回 false。
代码生成
有关 System object 和代码生成的信息,请参阅MATLAB 代码生成中的 System object (MATLAB Coder)。