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

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