在大多数情况下,当您为MATLAB生成代码时®接受或返回数组的函数,在生成的C / C ++函数的界面上存在数组。对于在编译时未知的数组大小,或者其绑定超过预定义阈值,在堆上动态分配生成阵列的存储器。否则,在堆栈上静态分配生成数组的存储器。看可变大小阵列的控制内存分配。
如果选择C ++作为用于代码生成的目标语言,默认情况下,动态分配的数组将实现为调用的类模板编码器:: Array.
在生成的代码中。要在您的自定义C ++代码中使用动态分配的数组,您将与生成的C ++函数集成,学会使用编码器:: Array.
模板。
默认情况下,生成的C ++代码使用编码器:: Array.
模板实现动态分配的数组。相反,您可以选择生成使用C样式的C ++代码emxarray
数据结构实现动态分配的数组。生成C风格emxarray
数据结构,执行以下操作之一:
在代码配置对象中(Coder.mexcodeConfig
那coder.codeConfig
, 或者Coder.embeddedCodeConfig
),设置dynamicmemoryallocationInterface.
参数到'C'
。
在里面Matlab Coder™应用程序,在记忆标签,设置动态内存分配界面至使用C样式EMXARRAY
。
要了解有关静态分配的数组或通过使用C样式实现的动态分配数组的更多信息emxarray
数据结构,见在生成的函数接口中使用C阵列。
此表列出了生成的C ++代码中的动态阵列表示的两个典型案例。为了定义编码器:: Array.
在生成的代码中实现动态阵列的模板,请参阅使用编码器:: Array类模板。
算法描述和数组大小 |
Matlab功能 |
生成的C ++功能界面 |
---|---|---|
将介绍在30,000元素的可变大小行向量上。 可变大小,不受限制在阈值内。 |
功能b = create_vec2.%#codegen.b =零(1,0);编码器.Varsize('B',[1 30000],[0 1]);为了我= 1:500如果圆形(兰特)b = [1 b];结尾结尾 |
void create_vec2(编码器:: array |
创建一个由无界整数输入确定的大小的数组。 在编译时未知。 |
功能y = create_vec3(n)%#codegen.Y = INT8(1,N)); |
void create_vec3(Double N,编码器:: Array <签名Char,2U>&Y) |
编码器:: Array.
类模板为MATLAB函数生成C ++代码时,代码生成器会产生标题文件coder_array.h.
在构建文件夹中。此头文件包含类模板的定义大批
在命名空间中编码器
。这编码器:: Array.
模板在生成的代码中实现动态分配的数组。此模板的声明是:
模板类数组
T.
并有N
方面。例如,要声明二维动态数组myArray.
包含类型的元素INT32_T.
在您的自定义C ++代码中,使用:
编码器:: ArrayMyArray
要在您想要与生成的代码集成的自定义C ++代码中使用动态分配的数组(例如,自定义主函数),请包括coder_array.h.
您的自定义中的标题文件.cpp.
文件。此表显示了您使用的API,用于在自定义C ++代码中与动态阵列创建和交互。
行动 |
指示 |
---|---|
声明一个动态数组 |
使用 编码器:: Array |
分配内存 |
使用 myarray.set_size(1,100) 如果是尺寸 |
访问大小向量 |
进入 myArray.size(1) |
索引进入动态阵列 |
使用标准C ++语法进行数组索引。例如,设置 myArray [i] =我 |
定义MATLAB功能xtest1.
接受数组X
,添加标量一种
对其每个元素,并返回生成的数组y
。
功能y = xtest1(x,a)y = x;为了i = 1:numel(x)y(i)= x(i)+ a;结尾
您的目标是生成C ++可执行文件xtest1.
可以接受并返回一系列INT32_T.
元素。您希望阵列的第一个维度是单例和第二维度要无限制。
在文件中定义C ++主要函数xtest1_main.cpp.
在您当前的工作文件夹中。
#include#include #include int main(int argc,char * argv []){static_cast (argc);static_cast (argv);编码器:: Array MyArray;myarray.set_size(1,100);for(int i = 0; i MyResult;xtest1(MyArray,1000,MyResult);for(int i = 0; i 0)std :: cout <<“”;std :: cout << myResult [i];if((((i + 1)%10)== 0)std :: cout << std :: endl; } std::cout << std::endl; return 0; }
该主要功能包括标题文件coder_array.h.
那个包含编码器:: Array.
类模板定义。主函数使用上一节中表中描述的API来执行以下操作:
宣布myArray.
和myresult
作为二维动态阵列INT32_T.
元素。
动态设置两个维度的大小myArray.
至1
和100.
通过使用set_size.
方法。
访问大小向量myresult
通过使用myresult.size.
。
通过运行此脚本生成代码。代替'C:\工作'
使用当前工作文件夹的路径。
cfg = coder.config('EXE文件');cfg.targetlang ='c ++';cfg.cusomsource ='xtest1_main.cpp';cfg.custominclude ='C:\工作';Codegen.-Config.CFG.- args.{coder.typeof(int32(0),[1 inf]),Int32(0)}xtest1_main.cpp.XTEST1.M.-报告
代码生成器生成可执行文件xtest1.exe.
在您当前的工作文件夹中。
定义MATLAB功能XStringTest.
接受角色矢量str.
,插入str.
字符向量之间'你好 '
和' 世界!'
,并返回结果。您的目标是生成一个可执行的C ++可执行文件XStringTest.
。
功能y = xstringtest(str)断言(ISA(str,'char'));断言(大小(str,1)== 1);断言(大小(str,2)> = 0);y = ['你好 'str.' 世界!'];
在文件中定义C ++主要函数xstringtest_main.cpp.
在您当前的工作文件夹中。这个主要功能使用std ::
声明矢量v
的图表
您传递给生成的C ++函数的元素XStringTest.
。
#include#include #include int main(int,char * []){coder :: array 结果;STD :: Vector vec;vec.resize(10);for(size_t i = 0; i <10; i ++){vec [i] = static_cast ('a'+ i);xstringtest(VEC,结果);std :: cout <<“结果是”<< static_cast (结果)<< std :: endl;返回0;}
通过运行此脚本生成代码。代替'C:\工作'
使用您当前的工作文件夹。
cfg = coder.config('EXE文件');cfg.targetlang ='c ++';cfg.cusomsource ='xstringtest_main.cpp';cfg.custominclude ='C:\工作';Codegen.-Config.CFG.- args.{coder.typeof(char('x'),[1 inf])}xstringtest_main.cpp.Xstringtest.m.-报告
代码生成器生成可执行文件xstringtest.exe.
在您当前的工作文件夹中。