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 использование аргумента type int32. Откройте отчет генерации кода.

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

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

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

tbl = gettable(1024);

с:

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

Сгенерируйте код для getsine использование аргумента type 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 как extinsic использование 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 Coder оценивает функцию и заменяет вхождения out1,...,outN с константами в сгенерированном коде.

Совет

  • Когда это возможно, генератор кода constant-folds выражения автоматически. Как правило, автоматическое свертывание константы происходит только для выражений со скалярами. Использовать 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).

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

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

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

Введенный в R2013b