Main Content

Tips for Defining System Objects

A System object™ is a specialized MATLAB® object that is optimized for iterative processing. Use System objects when you need to run an object multiple times or process data in a loop. When defining your own System object, use the following suggestions to help your System object run more quickly.

General

  • Define all one-time calculations in the setupImpl method and cache the results in a private property. Use the stepImpl method for repeated calculations.

  • Specify Boolean values using true or false instead of 1 or 0, respectively.

  • If the variables in a method do not need to retain their values between calls, use local scope for those variables in that method.

Inputs and Outputs

  • Some methods use the stepImpl algorithm inputs as their inputs, such as setupImpl, updateImpl, validateInputsImpl, isInputDirectFeedThroughImpl, and processInputSpecificationChangeImpl. The inputs must match the order of inputs to stepImpl, but do not need to match the number of inputs. If your implementation does not require any of the inputs to the System object, you can leave them all off.

  • For the getNumInputsImpl and getNumOutputsImpl methods, if you set the return argument from an object property, that object property must have the Nontunable attribute.

Using ~ as an Input Argument in Method Definitions

All methods, except static methods, expect the System object handle as the first input argument. You can use any name for your System object handle. The code inserted by the MATLAB Editor menu uses obj.

In many examples, instead of passing in the object handle, ~ is used to indicate that the object handle is not used in the function. Using ~ instead of an object handle prevents warnings about unused variables.

Properties

  • For properties that do not change, define them in as Nontunable properties. Tunable properties have slower access times than Nontunable properties

  • Whenever possible, use the protected or private attribute instead of the public attribute for a property. Some public properties have slower access times than protected and private properties.

  • If properties are accessed more than once in the stepImpl method, cache those properties as local variables inside the method. A typical example of multiple property access is a loop. Iterative calculations using cached local variables run faster than calculations that must access the properties of an object. When the calculations for the method complete, you can save the local cached results back to the properties of that System object. Copy frequently used tunable properties into private properties. This best practice also applies to the updateImpl and outputImpl methods.

    For example, in this code k is accessed multiple times in each loop iteration, but is saved to the object property only once.

    function y = stepImpl(obj,x) 
      k = obj.MyProp; 
      for p=1:100 
        y = k * x; 
        k = k + 0.1; 
      end 
      obj.MyProp = k; 
    end

  • Default values of properties are shared across all instances of an object. Two instances of a class can access the same default value if that property has not been overwritten by either instance.

Text Comparisons

Do not use character vector comparisons or character vector-based switch statements in the stepImpl method. Instead, create a method handle in setupImpl. This handle points to a method in the same class definition file. Use that handle in a loop in stepImpl.

This example shows how to use method handles and cached local variables in a loop to implement an efficient object. In setupImpl, choose myMethod1 or myMethod2 based on a character vector comparison and assign the method handle to the pMethodHandle property. Because there is a loop in stepImpl, assign the pMethodHandle property to a local method handle, myFun, and then use myFun inside the loop.

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

For System objects being included in Simulink, add the StrictDefaults attribute. This attribute sets all the MutableImpl methods to return false by default.

Code Generation

For information about System objects and code generation, see System Objects in MATLAB Code Generation (MATLAB Coder).