Система object™ является специализированным объектом MATLAB®, который оптимизирован для итеративной обработки. Используйте Системные объекты, когда необходимо будет запустить объект многократно или обработать данные в цикле. При определении собственного Системного объекта используйте следующие предложения, чтобы помочь Системному объекту, запущенному более быстро.
Задайте все одноразовые вычисления в методе setupImpl
и кэшируйте результаты в частной собственности. Используйте метод stepImpl
для повторных вычислений.
Задайте булевы значения с помощью true
или false
вместо 1
или 0
, соответственно.
Если переменные в методе не должны сохранять свои значения между вызовами, используйте локальный осциллограф для тех переменных в том методе.
Некоторые методы используют входные параметры алгоритма stepImpl
в качестве своих входных параметров, таких как setupImpl
, updateImpl
, validateInputsImpl
, isInputDirectFeedThroughImpl
и processInputSizeChangeImpl
. Входные параметры должны совпадать с порядком входных параметров к stepImpl
, но не должны совпадать с количеством входных параметров. Если ваша реализация не требует ни одного из входных параметров к Системному объекту, можно оставить их всех прочь.
Для getNumInputsImpl
и методов getNumOutputsImpl
, если вы устанавливаете возвращаемый аргумент от свойства объекта, то свойство объекта должно иметь атрибут Nontunable
.
Все методы, кроме статических методов, ожидают указатель Системного объекта как первый входной параметр. Можно использовать любое имя для указателя Системного объекта. Код, введенный меню MATLAB Editor, использует obj
.
Во многих примерах, вместо того, чтобы передать в указателе на объект, ~
используется, чтобы указать, что указатель на объект не используется в функции. Используя ~ вместо указателя на объект предотвращает предупреждения о неиспользуемых переменных.
Для свойств, которые не изменяются, задайте их в как свойства Nontunable
. свойства Tunable
имеют более медленные времена доступа, чем свойства Nontunable
Каждый раз, когда возможно, используйте protected
или атрибут private
вместо атрибута public
для свойства. Некоторые свойства public
имеют более медленные времена доступа, чем свойства protected
и private
.
Если к свойствам получают доступ несколько раз в методе stepImpl
, кэшируют те свойства как локальные переменные в методе. Типичным примером множественного доступа к свойствам является цикл. Итеративные вычисления с помощью кэшируемых локальных переменных, запущенных быстрее, чем вычисления, которые должны получить доступ к свойствам объекта. Когда вычисления для завершенного метода, можно сохранить локальные кэшируемые результаты назад в свойства того Системного объекта. Копия часто использовала настраиваемые свойства в частные собственности. Эта лучшая практика также применяется к 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
Значения по умолчанию свойств совместно используются через все экземпляры объекта. Два экземпляра класса могут получить доступ к тому же значению по умолчанию, если то свойство не было перезаписано ни одним экземпляром.
Не используйте сравнения вектора символа или основанные на векторе символа операторы switch в методе stepImpl
. Вместо этого создайте указатель метода в 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, добавьте атрибут StrictDefaults
. Этот атрибут устанавливает все методы MutableImpl
возвращать false по умолчанию.
Для получения информации о Системных объектах и генерации кода, смотрите Системные объекты в Генерации кода MATLAB (MATLAB CODER).