Системный 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).