在大多数情况下,当你为MATLAB生成代码时®接受或返回一个数组函数,存在在所生成的C / C ++函数的接口的阵列。对于数组大小是未知在编译时,或者其结合的超过预定阈值,用于将所生成的阵列的存储器是动态分配在堆上。否则,所产生的阵列的存储器是静态分配堆栈上。看到为可变大小数组控制内存分配。
如果选择c++作为代码生成的目标语言,那么默认情况下,动态分配的数组将被实现为一个类模板编码器:数组
在生成的代码中。要在与生成的c++函数集成的自定义c++代码中使用动态分配的数组,请学习使用编码器:数组
模板。
默认情况下,所生成的C ++代码使用编码器:数组
模板来实现动态分配的数组。相反,您可以选择生成使用C风格的c++代码emxArray
数据结构来实现动态分配数组。要生成C样式emxArray
数据结构,请执行下列操作之一:
在代码配置对象(coder.MexCodeConfig
,coder.CodeConfig
,或coder.EmbeddedCodeConfig
),设置DynamicMemoryAllocationInterface
参数“C”
。
在里面MATLAB编码器™应用程序,内存选项卡,设置动态内存分配接口来使用C风格的EmxArray
。
了解使用C样式实现的静态分配数组或动态分配数组的更多信息emxArray
数据结构,请参阅使用C数组中生成的函数接口。
此表列出了在生成C ++代码动态数组表示两种典型的情况。下一节介绍的定义编码器:数组
模板,在生成的代码中实现动态数组。
算法描述和数组大小 |
MATLAB功能 |
生成的C ++函数接口 |
---|---|---|
推到那些以30,000元件界定的可变大小行向量。 可变大小,阈值内不界定。 |
功能B = create_vec2% # codegenB =零(1,0);coder.varsize(“B”[30000], [0 1]);为I = 1:500如果round(rand) B = [1 B];结束结束 |
空隙create_vec2(编码器::阵列<双,2U>&B) |
创建一个数组,其大小由一个无界整数输入确定。 未知在编译时。 |
功能y = create_vec3 (n)% # codegenY = INT8(一(1,N)); |
空隙create_vec3(双N,译码器::阵列<符号的字符,2U>&y)的 |
编码器:数组
类模板当您为MATLAB函数生成c++代码时,代码生成器将生成一个头文件coder_array.h
build文件夹中。这个头文件包含类模板的定义排列
的命名空间编码器
。该编码器:数组
模板工具在所生成的代码中的动态分配数组。此模板的声明是:
模板类阵列
T
并已N
尺寸。例如,声明一个2
维动态数组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[我]=我 |
定义功能的MATLABxTest1
接受数组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 < iostream > # include < coder_array。h > # include < xTest1。static_cast(argc);static_cast <空白> (argv);编码器:数组< int32_T 2 > myArray;myArray。set_size(1, 100); for (int i = 0; i < myArray.size(1); i++) { myArray[i] = i; } coder::array myResult; xTest1(myArray, 1000, myResult); for (int i = 0; i < myResult.size(1); i++) { if (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
包含编码器:数组
类模板定义。主函数使用在表中的前一节中所描述的API来执行以下操作:
声明myArray
和myResult
作为2
的维动态数组int32_T
元素。
控件的两个维度的大小动态设置myArray
来1
和100
通过使用set_size
方法。
访问的大小的矢量myResult
通过使用myResult.size
。
通过运行此脚本生成代码。取代“C: \工作”
由路径到您当前的工作文件夹。
cfg = coder.config (exe”);cfg。TargetLang =“c++”;cfg.CustomSource ='xTest1_main.cpp';cfg。CustomInclude =“C: \工作”;代码生成配置cfgarg游戏{code .typeof(int32(0), [1 inf]), int32(0)}xTest1_main.cppxTest1.m-报告
代码发生器产生的可执行文件xTest1.exe
在当前工作文件夹中。
定义功能的MATLABxStringTest
接受字符向量str
、插入str
字符向量之间'你好 '
和“世界!”
,并返回结果。你的目标是产生一个C ++的可执行文件xStringTest
。
功能Y = xStringTest(STR)的断言(ISA(STR,“字符”));断言(大小(STR,1)== 1);断言(大小(STR,2)> = 0);Y = ['你好 'str“世界!”]。
在文件中定义一个c++主函数xStringTest_main.cpp
在当前工作文件夹中。该功能主要用途std::向量
申报矢量VEC
的图表
元素传递给所生成的C ++函数xStringTest
。
# include < iostream > # include < coder_array。h > # include < xTest1。h bb1 int main(int, char *[]) {coder::arrayresult;std::向量< char_T >矢量;vec.resize (10);(size_t我= 0;我< 10;{vec[i] = static_cast ('A' + i);} xStringTest(矢量,结果);std::cout << "Result is " << std::string>(Result) << std::endl;返回0; }
通过运行此脚本生成代码。取代“C: \工作”
通过当前的工作文件夹。
cfg = coder.config (exe”);cfg。TargetLang =“c++”;cfg.CustomSource =“xStringTest_main.cpp”;cfg。CustomInclude =“C: \工作”;代码生成配置cfgarg游戏{coder.typeof(炭( 'X'),[1个INF])}xStringTest_main.cppxStringTest.m-报告
代码发生器产生的可执行文件xStringTest.exe
在当前工作文件夹中。