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

Система 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

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

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

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