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