主要内容

生成MEX代码加速弹跳球的模拟

这个例子展示了如何使用生成的MEX函数加速MATLAB®算法的执行。它使用codegen命令,为使用多个MATLAB文件的复杂应用程序生成MEX函数。您可以使用codegen来检查您的MATLAB代码是否适合于代码生成,并且在许多情况下,可以加速您的MATLAB算法。您可以运行MEX函数来检查运行时错误。

先决条件

这个示例没有先决条件。

关于run_balls函数

run_balls.m函数接受单个输入来指定要模拟的弹跳球的数量。模拟运行并绘制球的弹跳图,直到没有剩余能量,并返回所有球的状态(位置)。

类型run_balls
给定n个球,运行一个模拟直到球完全停止(或当系统没有更多的动能)。Function balls = run_balls(n) %#codegen code .extrinsic('fprintf');播种随机数生成器将保证我们每次调用该函数时得到完全相同的模拟。old_settings = rng(1283年,V4);'cdata'变量是一个表示colordata位图的矩阵,%将在每一个时间步骤中渲染。cdata = 0(400600年,“uint8”);% Setup figure windows im = setup_figure_window(cdata);获取“n”球的初始配置。= initialize_balls(cdata, n);能量= 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函数

首先,使用该命令生成一个MEX函数codegen后面跟着要编译的MATLAB文件的名称。传递一个示例输入(args 0),以指示将用double类型的输入调用生成的MEX函数。

codegenrun_ballsarg游戏0
代码生成成功。

run_balls函数调用其他MATLAB函数,但在调用时只需要指定入口点函数codegen

默认情况下,codegen生成一个名为run_balls_mex在当前文件夹中。这允许您测试MATLAB代码和MEX函数,并比较结果。

比较结果

跑和时间原配run_balls函数,然后是生成的MEX函数。

抽搐,run_balls (50);t1 = toc;
迭代10迭代20 30 40迭代50迭代60 70 80迭代90迭代100迭代110迭代120迭代130 140 150迭代160迭代170迭代180 190 200迭代210迭代220 230 240迭代250迭代260 Iteration 270 Iteration 280 Completed iterations: 281
抽搐,run_balls_mex (50);t2 = toc;

图MATLAB编码器弹跳球包含一个轴对象。axis对象包含一个image类型的对象。

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

图MATLAB编码器弹跳球包含一个轴对象。axis对象包含一个image类型的对象。

迭代:281年完成

估计速度为:

流(1,'加速:x ~%2.1f\n'、t1 / t2);
加速:x ~2.9