В этом примере показано, как сгенерировать 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_averageCode 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() с новым множеством значений.