Работа с персистентными переменными

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

Предпосылки

Нет никаких предпосылок для этого примера.

О функции 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-функцию

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

codegen compute_average

По умолчанию 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
Была ли эта тема полезной?