主要内容

使用动态内存分配进行原子仿真

此示例显示了如何生成用于MATLAB®算法的代码,该算法运行弹跳“原子”的模拟,并在许多迭代后返回结果。算法接受的原子数没有上限,因此此示例利用动态内存分配。

先决条件

这个例子没有先决条件。

有关run_atoms.功能

run_atoms.m.功能运行弹跳原子的模拟(也施加重力和能量损失)。

帮助run_atoms.
原子= run_atoms(原子,n)原子= run_atoms(原子,n,迭代),其中'原子'原子的初始和最终状态(可以为空)'n'是模拟的原子数。'Iter'是模拟的迭代次数(如果省略它默认为3000次迭代。)

设置代码生成选项

创建代码生成配置对象

cfg = coder.config;%启用可变大小矩阵的动态内存分配。cfg.dynamicmemoryallocation =.'AllvariablesizeAray';

设置示例输入

创建模板结构'原子'以提供具有有关输入参数类型的必要信息的编译器。原子是具有四个字段(x,y,Vx,Vy)的结构,指定笛卡尔坐标的位置和速度。

atom = struct('X',0,'是',0,'vx',0,'vy',0);

生成MEX功能进行测试

使用命令Codegen.以下论点:

-args {coder.typeof(atom,[1 inf]),0,0}表示第一个参数是原子的行矢量,其中列数可能是无限的。第二个和第三个参数是标量级双值。

-config cfg.启用动态内存分配,由Workspace变量定义CFG.

Codegen.run_atoms.-  args.{coder.typeof(atom,[1 inf]),0,0}-Config.CFG.-Orun_atoms_mex.
代码成功。

运行mex函数

MEX函数在给定空的原子列表中,在大约1000个迭代步骤中模拟10000原子。返回值是仿真完成后所有原子的状态。

原子= Repmat(原子,1,0);Atoms = run_atoms_mex(原子,10000,1000)
迭代:50次迭代:100次迭代:150次迭代:200次迭代:250次迭代:300次迭代:350迭代:400次迭代:45次迭代:55次迭代:550迭代:600次迭代:700迭代:75次迭代:800迭代:800迭代:800迭代:800迭代:800迭代:800迭代:850迭代:900次迭代:950迭代:1000完成迭代:1000
原子=1×10000结构数组与字段:x y vx vy

再次运行mex函数

使用另外500个迭代步骤继续模拟

原子= run_atoms_mex(原子,10000,500)
迭代:50次迭代:100次迭代:150次迭代:200次迭代:250迭代:300次迭代:350迭代:400迭代:450迭代:500完成迭代:500
原子=1×10000结构数组与字段:x y vx vy

生成独立的C代码库

要生成C库,请为库创建标准配置对象:

cfg = coder.config('lib');

启用动态内存分配

cfg.dynamicmemoryallocation =.'AllvariablesizeAray';

在MATLAB中,默认数据类型是双倍的。但是,整数通常用于C代码,所以通过INT32.Integer示例值以表示原子数和迭代的数量。

Codegen.run_atoms.-  args.{coder.typeof(原子,[1 inf]),Int32(0),Int32(0)}-Config.CFG.
代码成功。

检查生成的代码

创建库时,代码在文件夹中生成codegen / lib / run_atom /。此文件夹中的代码是自包含的。与编译的C代码接口,只需要生成的标题文件和库文件。

谜语Codegen / lib / run_atoms
。RTATGNAN.h run_atoms_emxapi.h.trgetnan.o run_atoms_emxapi.o .gitignore rt_nonfinite.c rt_atoms_emxutil.c _clang格式rt_nonfinite.h run_atoms_emxutil.h buildinfo.matttr_nonfinite.o run_atoms_emxutil.o codefo.matttrw_proj.tmw run_atoms_initialize.codeDescriptor。dmr rtwtypes.h run_atoms_initialize.h compileInfo.mat run_atoms.a run_atoms_initialize.o defines.txt run_atoms.c run_atoms_rtw.mk examples run_atoms.h run_atoms_terminate.c interface run_atoms.o run_atoms_terminate.h rtGetInf.c run_atoms_data.c run_atoms_terminate.o rtGetInf.h run_atoms_data.h run_atoms_types.h rtGetInf.o run_atoms_data.o rtGetNaN.c run_atoms_emxAPI.c

写一个C主要功能

通常,主要函数是执行渲染或其他处理的平台相关代码。在此示例中,纯ANSI-C功能会产生文件run_atoms_state.m.哪个(运行时)包含原子仿真的最终状态。

类型run_atoms_main.c.
/ *包括标准C库* / #include  / *接口到我们编译的主要功能。* / #include“codegen / exe / run_atoms / run_atoms.h”/ * emx数据结构的接口。* / #include“codegen / exe / run_atoms / run_atoms_emxapi.h”int main(int argc,char ** argv){file * fid;INT I;emxarray_atom *原子;/ *未使用* /(空白)ARGC的主要论点;(空虚)argv;/ *最初创建一个空行向量的原子(1行,0列)* /原子= emxcreate_atom(1,0);/ *调用函数以在1000次迭代步骤中模拟10000原子* / run_atoms(原子,10000,000);/ *再次调用函数以进行另外500次迭代步骤* / run_atoms(原子,10000,500); /* Print the result to a file */ fid = fopen("atoms_state.txt", "w"); for (i = 0; i < atoms->size[1]; i++) { fprintf(fid, "%f %f %f %f\n", atoms->data[i].x, atoms->data[i].y, atoms->data[i].vx, atoms->data[i].vy); } /* Close the file */ fclose(fid); /* Free memory */ emxDestroyArray_Atom(atoms); return(0); }

为可执行文件创建配置对象

cfg = coder.config('EXE文件');cfg.dynamicmemoryallocation =.'AllvariablesizeAray';

生成独立的可执行文件

您必须通过功能(run_atoms.m.)以及自定义C代码(run_atoms_main.c.) 这Codegen.命令自动生成来自MATLAB代码的C代码,然后调用C编译器与自定义C代码一起捆绑此生成的代码(run_atoms_main.c.)。

Codegen.run_atoms.run_atoms_main.c.-  args.{coder.typeof(原子,[1 inf]),Int32(0),Int32(0)}-Config.CFG.
代码成功。

运行可执行文件

仿真完成后,这会产生该文件atoms_state.txt.。TXT文件是10000x4矩阵,其中每行是表示整个系统当前状态的原子(x,y,vx,vy)的位置和速度。

系统(['。'filesep.'run_atoms']);

获取状态

运行可执行文件atoms_state.txt.。现在,从已保存的矩阵重新创建结构数组:

加载atoms_state.txt.-ascii.清除原子为了i = 1:大小(atoms_state,1)原子(1,i).x = atoms_state(i,1);原子(1,i).y = atoms_state(i,2);原子(1,i).vx = atoms_state(i,3);原子(1,i).vy = atoms_state(i,4);结尾

渲染状态

称呼run_atoms_mex.零迭代仅渲染。

run_atoms_mex(原子,10000,0);

图Matlab编码器原子包含轴。轴包含类型图像的对象。