在大多数情况下,当您为MATLAB生成代码时®函数接受或返回数组时,生成的C/ c++函数的接口上有一个数组。对于在编译时未知的数组大小,或其边界超过预定义阈值的数组,生成的数组的内存将在堆上动态分配。否则,生成的数组的内存将在堆栈上静态分配。看到可变大小阵列的控制内存分配.
如果选择C ++作为用于代码生成的目标语言,默认情况下,动态分配的数组将实现为调用的类模板编码器:: Array.
在生成的代码中。要在您的自定义C ++代码中使用动态分配的数组,您将与生成的C ++函数集成,学会使用编码器:: Array.
模板。
默认情况下,生成的c++代码使用编码器:: Array.
模板实现动态分配的数组。相反,您可以选择生成使用C样式的C ++代码emxArray
数据结构实现动态分配的数组。生成C风格emxArray
数据结构,执行下列操作之一:
在代码配置对象中(编码器。MexCodeConfig
那编码器。CodeConfig
, 或者Coder.embeddedCodeConfig
),设置dynamicmemoryallocationInterface.
参数到'C'
.
在Matlab Coder™应用程序,记忆选项卡,设置动态内存分配界面到使用C样式EMXARRAY
.
了解更多关于使用C风格实现的静态分配数组或动态分配数组的信息emxArray
数据结构,见在生成的函数接口中使用C数组.
该表列出了生成的c++代码中动态数组表示的两种典型情况。的定义编码器:: Array.
在生成的代码中实现动态数组的模板,参见使用coder::array类模板.
算法描述和数组大小 |
MATLAB函数 |
生成c++函数接口 |
---|---|---|
将1推到以30000个元素为边界的可变大小行向量上。 可变大小,不在阈值范围内。 |
函数B = create_vec2%#codegen.B = 0 (1,0);coder.varsize ('B',[1 30000],[0 1]);为了i = 1:50 0如果圆形(兰特)b = [1 b];结尾结尾 |
void create_vec2(coder::array |
创建一个由无界整数输入确定的大小的数组。 编译时未知。 |
函数y = create_vec3 (n)%#codegen.y = int8 ((1, n)); |
void create_vec3(double n, coder::array |
编码器:: Array.
类模板为MATLAB函数生成C ++代码时,代码生成器会产生标题文件coder_array.h
在构建文件夹中。这个头文件包含类模板的定义数组
在命名空间中编码器
.的编码器:: Array.
模板在生成的代码中实现动态分配的数组。该模板的声明如下:
模板类数组
T.
并有N
方面。例如,要声明二维动态数组myArray.
包含类型元素的INT32_T.
在你的自定义c++代码中,使用:
编码器:数组< int32_T 2 > myArray
要在您想要与生成的代码集成的自定义C ++代码中使用动态分配的数组(例如,自定义主函数),请包括coder_array.h
您的自定义中的标题文件.cpp.
文件。该表显示了在定制c++代码中用于创建动态数组并与之交互的API。
行动 |
指令 |
---|---|
声明一个动态数组 |
使用 编码器:数组< int32_T 2 > myArray |
分配内存 |
使用 myarray.set_size(1,100) 如果是尺寸 |
访问大小向量 |
访问 myArray.size (1) |
索引到动态数组中 |
使用标准C ++语法进行数组索引。例如,设置 myArray [i] =我 |
定义MATLAB函数xTest1
接受数组X
,加上标量一种
对其每个元素,并返回生成的数组y
.
函数Y = xTest1(X, A);为了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; }
这个main函数包括头文件coder_array.h
包含编码器:: Array.
类模板定义。main函数使用上一节表中描述的API来执行以下操作:
宣布myArray.
和myResult
作为二维动态阵列INT32_T.
元素。
动态设置两个维度的大小myArray.
到1
和One hundred.
通过使用set_size
方法。
访问大小向量myResult
通过使用myresult.size.
.
通过运行此脚本生成代码。代替“C: \工作”
使用到当前工作文件夹的路径。
cfg = coder.config('可执行程序');cfg.targetlang =.'c ++';cfg。CustomSource =“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) assert(isa(str,“字符”));断言(大小(str, 1) = = 1);断言(大小(str, 2) > = 0);y = (“你好”str.“世界!”];
在文件中定义C ++主要函数xstringtest_main.cpp.
在当前工作文件夹中。此主要功能使用std ::
声明向量vec
的char_T
元素,传递给生成的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('可执行程序');cfg.targetlang =.'c ++';cfg。CustomSource ='xstringtest_main.cpp';cfg.custominclude =“C: \工作”;codegen-Config.CFG.- args.{coder.typeof (char(“X”),[1正])}xstringtest_main.cpp.xStringTest.m报告
代码生成器生成一个可执行文件xStringTest.exe
在当前工作文件夹中。