coder.const

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

Синтаксис

out = coder.const(expression)
[out1,...,outN] = coder.const(handle,arg1,...,argN)

Описание

пример

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 i0;
  static const signed char iv0[10] = { 1, 4, 9, 16, 25, 36, 
                                 49, 64, 81, 100 };

  for (i0 = 0; i0 < 10; i0++) {
    y[i0] = (double)iv0[i0] + 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 для входного define типа можно следующим образом:

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 для входного define типа можно следующим образом:

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 с Внешними Вызовами функции.

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

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

    Смотрите Использование coder.const с Внешними Вызовами функции.

Введенный в R2013b