Советы по определению системных объектов

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

Для системных объектов, включенных в Simulink, добавьте StrictDefaults атрибут. Этот атрибут устанавливает все MutableImpl методы для возврата false по умолчанию.

Генерация кода

Для получения информации о системных объектах и генерации кода смотрите Системные объекты в Генерации кода MATLAB (MATLAB Coder).