В этом примере показано, как сгенерировать MEX-функцию от функции MATLAB®, compute_average
, это использует персистентные переменные. Это иллюстрирует, что необходимо очистить состояние персистентных переменных перед использованием функции, чтобы вычислить среднее значение нового множества значений.
Этот пример также показывает, как инициализировать и отключить состояние персистентных переменных для той же функции MATLAB в автономном сгенерированном коде. Необходимо очистить состояние персистентных переменных в сгенерированном коде перед использованием функции, чтобы вычислить среднее значение нового множества значений.
Нет никаких необходимых условий для этого примера.
compute_average
Функция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;
%#codegen
директива указывает, что код MATLAB предназначается для генерации кода.
Во-первых, сгенерируйте MEX-функцию с помощью команды codegen
сопровождаемый под названием файл MATLAB, чтобы скомпилировать.
codegen compute_average
Code generation successful.
По умолчанию, codegen
генерирует MEX-функцию под названием hello_world_mex
в текущей папке. Это позволяет вам тестировать код MATLAB и 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
(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
Состояния персистентных переменных в автономном сгенерированном коде очищены путем вызова инициирования и оконечных функций в основной функции. Эти функции сгенерированы генератором кода. Эти файлы находятся в 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
файл был отредактирован, чтобы вызвать оконечную функцию, compute_average_terminate()
очистить состояние персистентных переменных. Новый набор расчетов запущен путем вызова compute_average_initialize()
и main_compute_average()
с новым множеством значений.