В этом примере показано, как сгенерировать 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-функцию с помощью команды 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
Состояния постоянных переменных в автономном сгенерированном коде очищаются путем вызова функций 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()
с новым множеством значений.