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

Система object™ является специализированным объектом MATLAB®, который оптимизирован для итеративной обработки. Используйте Системные объекты, когда необходимо будет запустить объект многократно или обработать данные в цикле. При определении собственного Системного объекта используйте следующие предложения, чтобы помочь Системному объекту, запущенному более быстро.

Общий

  • Задайте все одноразовые вычисления в setupImpl метод и кэш результаты в частной собственности. Используйте stepImpl метод для повторных вычислений.

  • Задайте булевы значения с помощью true или false вместо 1 или 0, соответственно.

  • Если переменные в методе не должны сохранять свои значения между вызовами, используйте локальный осциллограф в тех переменных в том методе.

Вводы и выводы

  • Некоторые методы используют stepImpl алгоритм вводит как их входные параметры, такие как setupImplupdateImplvalidateInputsImplisInputDirectFeedthroughImpl, и 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).