Сгенерируйте код для стойких переменных

В этом примере показано, как сгенерировать MEX-функцию из функции MATLAB ®, compute_average, который использует постоянные переменные. Это иллюстрирует, что перед использованием функции необходимо очистить состояние постоянных переменных, чтобы вычислить среднее значение нового множества значений.

Этот пример также показывает, как инициализировать и остановить состояние постоянных переменных для той же функции MATLAB в автономном сгенерированном коде. Необходимо очистить состояние стойких переменных в сгенерированном коде, прежде чем использовать функцию, чтобы вычислить среднее значение нового множества значений.

Необходимые условия

Для этого примера нет необходимых условий.

О compute_average Функция

The compute_average.m функция использует две постоянные переменные, накопленную сумму и количество добавленных значений, так что можно вызвать функцию с одним значением за раз.

type compute_average
% y = compute_average(x)
% This function takes an input scalar value 'x' and returns the average
% value so far.
function y = compute_average(x) %#codegen
assert(isa(x,'double')); % Input is scalar double

% Declare two persistent variables 'sum' and 'cnt'.
persistent sum cnt;

% Upon the first call we need to initialize the variables.
if isempty(sum)
    sum = 0;
    cnt = 0;
end

% Compute the accumulated sum and the number of values so far.
sum = sum + x;
cnt = cnt + 1;

% Return the current average.
y = sum / cnt;

The %#codegen директива указывает, что код MATLAB предназначен для генерации кода.

Сгенерируйте MEX-функцию

Сначала сгенерируйте MEX-функцию с помощью команды codegen далее указывается имя файла MATLAB для компиляции.

codegen compute_average
Code generation successful.

По умолчанию codegen генерирует MEX-функцию с именем hello_world_mex в текущей папке. Это позволяет вам протестировать код MATLAB и MEX-функцию и сравнить результаты.

Запуск MEX-функции

(10 + 20 + 100) / 3 = 43.3333

compute_average_mex(10)
ans = 10
compute_average_mex(20)
ans = 15
compute_average_mex(100)
ans = 43.3333

Очистка внутреннего состояния стойких переменных

Очистить постоянные переменные можно с помощью clear mex команда.

clear mex

Еще раз запустите MEX-функцию, чтобы вычислить среднее значение другого Множества значений

(10 + 20 + 30 + 40) / 4 = 25

compute_average_mex(10)
ans = 10
compute_average_mex(20)
ans = 15
compute_average_mex(30)
ans = 20
compute_average_mex(40)
ans = 25

Очистка внутреннего состояния стойких переменных в автономном сгенерированном коде

Состояния постоянных переменных в автономном сгенерированном коде очищаются путем вызова функций initiate и terminate в основной функции. Эти функции генерируются генератором кода. Эти файлы находятся в codegen директория.

Можно отредактировать пример основного файла, main.c для вызова функций инициирования и завершения. Для примера:

type main.c
/*
 * File: main.c
 */
/* Include Files */
#include "main.h"
#include "compute_average.h"
#include "compute_average_terminate.h"
#include "compute_average_initialize.h"

/* Function Declarations */
static double argInit_real_T(void);
static void main_compute_average(void);

/* Function Definitions */
/*
 * Arguments    : void
 * Return Type  : double
 */
static double argInit_real_T(void)
{
  return 0.0;
}

/*
 * Arguments    : void
 * Return Type  : void
 */
static void main_compute_average(void)
{
  double y;

  /* Initialize function 'compute_average' input arguments. */
  /* Call the entry-point 'compute_average'. */
  y = compute_average(argInit_real_T());
}

/*
 * Arguments    : int argc
 *                const char * const argv[]
 * Return Type  : int
 */
int main(int argc, const char * const argv[])
{
  (void)argc;
  (void)argv;
  
  /* Initialize the entry-point function. */
  compute_average_initiatlize();
  
  /* Invoke the entry-point functions.
     You can call entry-point functions multiple times. */
  main_compute_average();

  /* Terminate the application. */
  compute_average_terminate();
  
  /*Once the application is terminated, the state of the persistent variables is cleared. */
  
  /* Re-initialize the entry-point function. */
  compute_average_initialize();
  
  /* You can run the application for a new set of values.*/
  main_compute_average();
  
  /* Terminate the application after your process is complete.*/
  compute_average_terminate();
  
  return 0;
}

/*
 * File trailer for main.c
 *
 * [EOF]
 */

Как видим, main.c файл был отредактирован, чтобы вызвать функцию terminate, compute_average_terminate() чтобы очистить состояние постоянных переменных. Новый набор расчетов запускается вызовом compute_average_initialize() и main_compute_average() с новым множеством значений.