Система object™ является специализированным объектом MATLAB®, который оптимизирован для итеративной обработки. Используйте Системные объекты, когда необходимо будет запустить объект многократно или обработать данные в цикле. При определении собственного Системного объекта используйте следующие предложения, чтобы помочь Системному объекту, запущенному более быстро.
Задайте все одноразовые вычисления в setupImpl
метод и кэш результаты в частной собственности. Используйте stepImpl
метод для повторных вычислений.
Задайте булевы значения с помощью true
или false
вместо 1
или 0
, соответственно.
Если переменные в методе не должны сохранять свои значения между вызовами, используйте локальный осциллограф для тех переменных в том методе.
Некоторые методы используют stepImpl
алгоритм вводит как их входные параметры, такие как setupImpl
updateImpl
validateInputsImpl
isInputDirectFeedthroughImpl
, и processInputSpecificationChangeImpl
. Входные параметры должны совпадать с порядком входных параметров к 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).