В этом примере показано, как ускорить выполнение алгоритма MATLAB ® с помощью сгенерированной функции MEX. Он использует codegen для создания функции MEX для сложного приложения, использующего несколько файлов MATLAB. Вы можете использовать codegen проверить, подходит ли код MATLAB для генерации кода и, во многих случаях, ускорить алгоритм MATLAB. Для проверки ошибок времени выполнения можно запустить функцию MEX.
Предпосылки для этого примера отсутствуют.
run_balls Функция run_balls.m функция принимает один вход, чтобы указать количество шаров для имитации. Моделирование запускает и строит график отскока шаров до тех пор, пока не останется энергии, и возвращает состояние (положения) всех шаров.
type run_balls% balls = run_balls(n)
% Given 'n' number of balls, run a simulation until the balls come to a
% complete halt (or when the system has no more kinetic energy).
function balls = run_balls(n) %#codegen
coder.extrinsic('fprintf');
% Copyright 2010-2013 The MathWorks, Inc.
% Seeding the random number generator will guarantee that we get
% precisely the same simulation every time we call this function.
old_settings = rng(1283,'V4');
% The 'cdata' variable is a matrix representing the colordata bitmap which
% will be rendered at every time step.
cdata = zeros(400,600,'uint8');
% Setup figure windows
im = setup_figure_window(cdata);
% Get the initial configuration for 'n' balls.
balls = initialize_balls(cdata, n);
energy = 2; % Something greater than 1
iteration = 1;
while energy > 1
% Clear the bitmap
cdata(:,:) = 0;
% Apply one iteration of movement
[cdata,balls,energy] = step_function(cdata,balls);
% Render the current state
cdata = draw_balls(cdata, balls);
iteration = iteration + 1;
if mod(iteration,10) == 0
fprintf(1, 'Iteration %d\n', iteration);
end
refresh_image(im, cdata);
end
fprintf(1, 'Completed iterations: %d\n', iteration);
% Restore RNG settings.
rng(old_settings);
Сначала создайте функцию MEX с помощью команды codegen за которым следует имя файла MATLAB для компиляции. Передать пример ввода (-args 0), чтобы указать, что сгенерированная функция MEX будет вызвана с входом типа double.
codegen run_balls -args 0
Code generation successful.
run_balls функция вызывает другие функции MATLAB, но при вызове необходимо указать только функцию начальной точки codegen.
По умолчанию codegen генерирует функцию MEX с именем run_balls_mex в текущей папке. Это позволяет протестировать код MATLAB и функцию MEX и сравнить результаты.
Прогон и время оригинала run_balls с последующей сгенерированной функцией MEX.
tic, run_balls(50); t1 = toc;
Iteration 10 Iteration 20 Iteration 30 Iteration 40 Iteration 50 Iteration 60 Iteration 70 Iteration 80 Iteration 90 Iteration 100 Iteration 110 Iteration 120 Iteration 130 Iteration 140 Iteration 150 Iteration 160 Iteration 170 Iteration 180 Iteration 190 Iteration 200 Iteration 210 Iteration 220 Iteration 230 Iteration 240 Iteration 250 Iteration 260 Iteration 270 Iteration 280 Completed iterations: 281
tic, run_balls_mex(50); t2 = toc;

Iteration 10 Iteration 20 Iteration 30 Iteration 40 Iteration 50 Iteration 60 Iteration 70 Iteration 80 Iteration 90 Iteration 100 Iteration 110 Iteration 120 Iteration 130 Iteration 140 Iteration 150 Iteration 160 Iteration 170 Iteration 180 Iteration 190 Iteration 200 Iteration 210 Iteration 220 Iteration 230 Iteration 240 Iteration 250 Iteration 260 Iteration 270 Iteration 280

Completed iterations: 281
Предполагаемая скорость:
fprintf(1, 'Speed up: x ~%2.1f\n', t1/t2);Speed up: x ~1.7