exponenta event banner

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

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

Общая информация

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

  • Укажите логические значения с помощью true или false вместо 1 или 0соответственно.

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

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

  • Некоторые методы используют stepImpl входы алгоритма как их входы, такие как setupImpl, updateImpl, validateInputsImpl, isInputDirectFeedThroughImpl, и processInputSpecificationChangeImpl. Входные данные должны соответствовать порядку входных данных stepImpl, но не нужно совпадать с количеством входов. Если реализация не требует ввода каких-либо данных в объект System, их можно оставить выключенными.

  • Для getNumInputsImpl и getNumOutputsImpl методы, если задать возвращаемый аргумент из свойства объекта, это свойство объекта должно иметь Nontunable атрибут.

Использование ~ в качестве входного аргумента в определениях методов

Все методы, за исключением статических, ожидают, что дескриптор объекта System будет первым входным аргументом. Для дескриптора объекта System можно использовать любое имя. Код, вставленный в меню редактора MATLAB, использует obj.

Во многих примерах вместо прохождения в дескрипторе объекта, ~ используется для указания того, что дескриптор объекта не используется в функции. Использование ~ вместо дескриптора объекта предотвращает предупреждения о неиспользуемых переменных.

Свойства

  • Для свойств, которые не изменяются, определите их как Nontunable свойства. Tunable свойства имеют более медленный доступ, чем Nontunable свойства

  • По возможности используйте protected или private вместо атрибута public атрибут для свойства. Некоторые public свойства имеют более медленный доступ, чем protected и private свойства.

  • Если свойства доступны более одного раза в stepImpl кэшировать эти свойства как локальные переменные в методе. Типичным примером множественного доступа к свойствам является цикл. Итеративные вычисления с использованием кэшированных локальных переменных выполняются быстрее, чем вычисления, которые должны получить доступ к свойствам объекта. По завершении вычислений для метода можно сохранить локальные кэшированные результаты обратно в свойства этого объекта System. Копирование часто используемых настраиваемых свойств в частные свойства. Эта передовая практика также применима к 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

  • Значения свойств по умолчанию являются общими для всех экземпляров объекта. Два экземпляра класса могут получить доступ к одному и тому же значению по умолчанию, если это свойство не было перезаписано ни одним из них.

Сравнение текста

Не используйте сравнения символьных векторов или операторы переключения на основе символьных векторов в 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).