exponenta event banner

coder.const

Сворачивание выражений в константы в сгенерированном коде

Описание

пример

out = coder.const(expression) оценивает expression и заменяет out с результатом анализа в сгенерированном коде.

пример

[out1,...,outN] = coder.const(handle,arg1,...,argN) вычисляет функцию с несколькими выходами, имеющую дескриптор handle. Затем он заменяет out1,...,outN с результатами анализа в сгенерированном коде.

Примеры

свернуть все

В этом примере показано, как указать константы в сгенерированном коде с помощью coder.const.

Запись функции AddShift который принимает входные данные Shift и добавляет его к элементам вектора. Вектор состоит из квадрата первых 10 натуральных чисел. AddShift генерирует этот вектор.

function y = AddShift(Shift) %#codegen
y = (1:10).^2+Shift;

Создать код для AddShift с использованием codegen команда. Откройте отчет по созданию кода.

codegen -config:lib -launchreport AddShift -args 0

Генератор кода создает код для создания вектора. Это добавляет Shift к каждому элементу вектора во время создания вектора. Определение AddShift в сгенерированном коде выглядит следующим образом:

void AddShift(double Shift, double y[10])
{
  int k;
  for (k = 0; k < 10; k++) {
    y[k] = (double)((1 + k) * (1 + k)) + Shift;
  }
}

Заменить выражение (1:10).^2 с coder.const((1:10).^2), а затем создать код для AddShift снова с использованием codegen команда. Откройте отчет по созданию кода.

codegen -config:lib -launchreport AddShift -args 0

Генератор кода создает вектор, содержащий квадраты первых 10 натуральных чисел. В созданном коде добавляется Shift к каждому элементу этого вектора. Определение AddShift в сгенерированном коде выглядит следующим образом:

void AddShift(double Shift, double y[10])
{
  int i;
  static const signed char iv[10] = { 1, 4, 9, 16, 25, 36, 
                                 49, 64, 81, 100 };

  for (i = 0; i < 10; i++) {
    y[i] = (double)iv[i] + Shift;
  }
}

В этом примере показано, как складывать записанную пользователем функцию в константу в сгенерированном коде.

Запись функции getsine который принимает входные данные index и возвращает элемент, на который ссылается index из таблицы поиска синусов. Функция getsine создает таблицу подстановки с помощью другой функции gettable.

function y = getsine(index) %#codegen
  assert(isa(index, 'int32'));
  persistent tbl;
  if isempty(tbl)
           tbl = gettable(1024);
  end
  y = tbl(index);

function y = gettable(n)
      y = zeros(1,n);
      for i = 1:n
         y(i) = sin((i-1)/(2*pi*n));
      end

Создать код для getsine использование аргумента типа int32. Откройте отчет по созданию кода.

codegen -config:lib -launchreport getsine -args int32(0)

Созданный код содержит инструкции по созданию таблицы подстановки.

Замените оператор:

tbl = gettable(1024);

с:

tbl = coder.const(gettable(1024));

Создать код для getsine использование аргумента типа int32. Откройте отчет по созданию кода.

Созданный код содержит саму таблицу подстановки. coder.const принудительно использует выражение gettable(1024) подлежит оценке во время генерации кода. Созданный код не содержит инструкций для анализа. Созданный код содержит результат анализа.

В этом примере показано, как задать константы в сгенерированном коде с помощью функции с несколькими выходами в coder.const заявление.

Запись функции MultiplyConst который принимает входные данные factor и умножает каждый элемент двух векторов vec1 и vec2 с factor. Функция генерирует vec1 и vec2 использование другой функции EvalConsts.

function [y1,y2] = MultiplyConst(factor) %#codegen
  [vec1,vec2]=EvalConsts(pi.*(1./2.^(1:10)),2);
  y1=vec1.*factor;
  y2=vec2.*factor;

function [f1,f2]=EvalConsts(z,n)
  f1=z.^(2*n)/factorial(2*n);
  f2=z.^(2*n+1)/factorial(2*n+1);

Создать код для MultiplyConst с использованием codegen команда. Откройте отчет по созданию кода.

codegen -config:lib -launchreport MultiplyConst -args 0

Генератор кода создает код для создания векторов.

Заменить инструкцию

[vec1,vec2]=EvalConsts(pi.*(1./2.^(1:10)),2);

с

[vec1,vec2]=coder.const(@EvalConsts,pi.*(1./2.^(1:10)),2);

Создать код для MultiplyConst с использованием codegen команда. Откройте отчет по созданию кода.

codegen -config:lib -launchreport MultiplyConst -args 0
Генератор кода не генерирует код для создания векторов. Вместо этого вычисляются векторы и указываются вычисленные векторы в сгенерированном коде.

В этом примере показано, как вызвать внешнюю функцию с помощью coder.const.

Запись XML-файла MyParams.xml содержащие следующие инструкции:

<params>
    <param name="hello" value="17"/>
    <param name="world" value="42"/>
</params>

Сохранить MyParams.xml в текущей папке.

Запись функции MATLAB ®xml2struct считывает XML-файл. Функция идентифицирует тег XML param внутри другого тега params.

После идентификации param, функция присваивает значение своему атрибуту name к имени поля структуры s. Функция также присваивает значение атрибута value к значению поля.

function s = xml2struct(file)

s = struct();
doc = xmlread(file);
els = doc.getElementsByTagName('params');
for i = 0:els.getLength-1
    it = els.item(i);
    ps = it.getElementsByTagName('param');
    for j = 0:ps.getLength-1
        param = ps.item(j);
        paramName = char(param.getAttribute('name'));
        paramValue = char(param.getAttribute('value'));
        paramValue = evalin('base', paramValue);
        s.(paramName) = paramValue;        
    end
end

Сохранить xml2struct в текущей папке.

Запись функции MATLAB MyFunc считывает XML-файл MyParams.xml в структуру s использование функции xml2struct. Объявить xml2struct как внешнее использование coder.extrinsic и вызвать его в coder.const заявление.

function y = MyFunc(u) %#codegen
  assert(isa(u, 'double'));
  coder.extrinsic('xml2struct');
  s = coder.const(xml2struct('MyParams.xml'));
  y = s.hello + s.world + u;

Создать код для MyFunc с использованием codegen команда. Откройте отчет по созданию кода.

codegen -config:dll -launchreport MyFunc -args 0

Генератор кода выполняет вызов xml2struct при формировании кода. Он заменяет поля структуры s.hello и s.world со значениями 17 и 42 в сгенерированном коде.

Входные аргументы

свернуть все

Выражение MATLAB или пользовательская функция с одним выходом.

Выражение должно иметь только константы времени компиляции. Функция должна принимать только постоянные аргументы. Например, следующий код приводит к ошибке генерации кода, поскольку x не является константой времени компиляции.

function y=func(x)
   y=coder.const(log10(x));

Чтобы устранить ошибку, назначьте x константу в коде MATLAB. Кроме того, во время создания кода можно использовать coder.Constant для определения типа ввода следующим образом:

codegen -config:lib func -args coder.Constant(10)

Пример: 2 *pi, factorial(10)

Дескриптор встроенной или написанной пользователем функции.

Пример: @log, @sin

Типы данных: function_handle

Аргументы функции с дескриптором handle.

Аргументы должны быть константами времени компиляции. Например, следующий код приводит к ошибке генерации кода, поскольку x и y не являются константами времени компиляции.

function y=func(x,y)
   y=coder.const(@nchoosek,x,y);

Чтобы устранить ошибку, назначьте x и y константам в коде MATLAB. Кроме того, во время создания кода можно использовать coder.Constant для определения типа ввода следующим образом:

codegen -config:lib func -args {coder.Constant(10),coder.Constant(2)}

Выходные аргументы

свернуть все

Значение expression. В созданном коде MATLAB Coder™ заменяет вхождения out со значением expression.

Выходы функции с рукояткой handle. Кодер MATLAB оценивает функцию и заменяет вхождения out1,...,outN с константами в созданном коде.

Совет

  • По возможности генератор кода автоматически сворачивает выражения. Как правило, автоматическое постоянное сворачивание происходит только для выражений со скалярами. Использовать coder.const когда генератор кода сам по себе не имеет константно-кратных выражений.

  • При вызове функции с постоянной интенсивностью вычислений, чтобы сократить время генерации кода, сделать вызов функции внешним. Внешний вызов функции вызывает оценку вызова функции MATLAB, а не генератором кода. Например:

    function j = fcn(z)
    zTable = coder.const(0:0.01:100);
    jTable = coder.const(feval('besselj',3,zTable));
    j = interp1(zTable,jTable,z);
    end

    См. раздел Использование coder.const с внешними вызовами функций (кодер MATLAB).

  • Если coder.const не может выполнить постоянное сворачивание вызова функции, попробуйте принудительно выполнить постоянное сворачивание, сделав вызов функции внешним. Внешний вызов функции вызывает оценку вызова функции MATLAB, а не генератором кода. Например:

    function yi = fcn(xi)
    y = coder.const(feval('rand',1,100));
    yi = interp1(y,xi);
    end

    См. раздел Использование coder.const с внешними вызовами функций (кодер MATLAB).

Представлен в R2013b