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