在命令行生成C代码
在本教程中,您将使用MATLAB®编码器™codegen
为MATLAB命令来生成一个静态C库函数。你第一次生成C代码,只能接受输入,有固定的预先指定的大小。然后生成C代码,可以接受许多不同大小的输入。
你也可以通过使用生成代码MATLAB编码器工作流应用程序。对于一个教程,看看通过使用MATLAB编码器应用生成C代码。
教程文件:欧氏距离
打开这个例子中获取文件对于本教程。
教程的描述文件
本教程使用的euclidean_data.mat
,euclidean.m
,test.m
,build_lib_fixed.m
,build_lib_variable.m
文件。
MATLAB数据文件
euclidean_data.mat
包含两个数据:一个点在三维欧氏空间和一组其他几个点在三维欧几里得空间。更具体地说:x
是一个3
——- - - - - -1
列向量表示一个点在三维欧几里得空间。cb
是一个3
——- - - - - -216年
数组中。每一列中cb
代表一个点在三维欧几里得空间。
MATLAB文件
euclidean.m
包含的功能欧几里得
实现核心算法在这个例子中。的函数x
和cb
作为输入。这之间的欧氏距离计算x
和每一个点cb
并返回这些数量:列向量
y_min
,等于列cb
表示最近的点x
。列向量
y_max
,等于列cb
代表最远的点x
。二维向量
idx
包含的列索引向量y_min
和y_max
在cb
。二维向量
距离
包含计算最小和最大距离x
。
函数[y_min, y_max idx,距离]=欧几里得(x, cb)%初始化最小距离作为距离cb的第一个元素%初始化最大距离作为距离cb的第一个元素idx (1) = 1;idx (2) = 1;距离(1)=规范(x-cb (: 1));距离(2)=规范(x-cb (: 1));%在cb找到向量最小距离x%在cb找到向量最大距离x为指数= 2:尺寸(cb, 2) d =规范(x-cb(:,指数));如果d <距离(1)距离(1)= d;idx(1) =指数;结束如果d >距离(2)距离(2)= d;idx(2) =指数;结束结束%输出最小和最大距离向量y_min = cb (:, idx (1));y_max = cb (:, idx (2));结束
MATLAB脚本
test.m
加载数据文件euclidean_data.mat
进入工作区。然后调用函数欧几里得
计算y_min
,y_max
,idx
,距离
。然后脚本显示在命令行计算量。加载
euclidean_data.mat
前的预处理步骤,执行调用的核心算法。显示结果的后处理步骤。%负载测试数据负载euclidean_data.mat%确定最近和最远的点和相应的距离[y_min, y_max idx,距离]=欧几里得(x, cb);%显示输出最近的点disp (“最近的点的坐标是:”);disp (num2str (y_min '));disp ([“最接近点的指数”num2str (idx (1))));disp ([距离最近的点的num2str(距离(1))));disp(换行符);%显示输出最远的点disp (最远的点的坐标:);disp (num2str (y_max '));disp ([“最远的点的指数”num2str (idx (2))));disp ([“距离最远的点”num2str(距离(2))));
构建脚本
build_lib_fixed.m
和build_lib_variable.m
包含命令生成静态C库从MATLAB代码接受固定大小和适应输入,分别。这些脚本的内容显示在教程中,当你生成C代码。
提示
你可以从MATLAB函数通过使用生成代码MATLAB编码器。不支持从MATLAB脚本代码生成。金宝app
使用测试脚本分离的预处理和后处理步骤功能实现的核心算法。这种做法使您能够轻松地重用你的算法。生成代码的MATLAB函数,实现了核心算法。你不生成代码的测试脚本。
生成C代码MATLAB函数
运行原MATLAB代码
运行测试脚本test.m
在MATLAB。输出显示y
,idx
,距离
。
最接近点的坐标是:0.8 0.8 0.4指数最接近的点是171距离最近的点是0.080374最远的点的坐标是:0 0 1指数最远的点是6距离最远的点是1.2923
使MATLAB适用于代码生成代码
MATLAB代码适合代码生成,使用代码分析器和代码生成工具。MATLAB编辑器中的代码分析器不断检查代码当你进入它。它报告问题和建议修改最大化性能和可维护性。代码生成工具准备屏幕的MATLAB代码特性和功能不支持代码生成。金宝app
某些MATLAB内置函数和工具箱函数、类和系统对象支持C / c++代码生成有特定的代码生成的局限性。金宝app这些限制和相关使用笔记中列出扩展功能相应的参考页面的部分。有关更多信息,请参见函数和对象支持C / c++代码生成金宝app。
开放
euclidean.m
在MATLAB编辑器。右上角的代码分析器消息指示器的MATLAB编辑是绿色的。分析没有检测错误、警告或改善代码的机会。函数声明后,添加
% # codegen
指令:函数[y, idx,距离]=欧几里得(x, cb)% # codegen
% # codegen
指令提示代码分析器来识别特定警告和错误代码生成。代码分析器消息指示器变成了红色,这表明它检测到代码生成问题。
你查看警告消息,移动鼠标到强调代码片段。警告表明,代码生成需要的变量
idx
和距离
加下标之前完全定义。这些警告出现,因为代码生成器必须确定这些变量的大小在他们第一次出现在代码。为了解决这个问题,使用的
这些数组函数同时分配和初始化。%初始化最小距离作为距离cb的第一个元素%初始化最大距离作为距离cb的第一个元素idx = 1 (1、2);距离= 1(1、2)*规范(x-cb (: 1));
代码分析器消息指示器就会变成绿色,表明它不检测任何更多的代码生成问题。
使用代码分析器的更多信息,请参阅校验码错误和警告使用代码分析器。
保存文件。
运行代码生成工具,准备调用
coder.screener
从MATLAB命令行功能。coder.screener (“欧几里得”)
这个工具不能发现任何代码生成问题
欧几里得
。有关更多信息,请参见代码生成工具准备。代码生成工具不支持金宝appMATLAB在线™。
请注意
分析仪和代码生成的代码准备工具可能无法检测所有代码生成问题。消除错误或警告后,这些工具检测,通过使用生成代码MATLAB编码器确定你的MATLAB代码有其他合规问题。
现在,您可以编译代码通过使用MATLAB编码器应用。在这里,编译指的是一代的C / c++代码从MATLAB代码。
请注意
编制MATLAB代码指的是一代的C / c++代码的MATLAB代码。在其他情况下,编译一词可以指一个C / c++编译器的作用。
定义输入类型
因为C使用静态类型,代码生成器必须确定类,大小和复杂性的MATLAB文件中的所有变量在代码生成时,也被称为编译时。因此,生成的代码文件时,您必须指定入口点函数的所有输入参数的属性。一个入口点函数是一个顶级的MATLAB函数生成代码。
当你通过使用生成代码codegen
命令,可以使用arg游戏
选项指定入口点函数的样本输入参数。代码生成器使用这些信息来确定输入参数的属性。
在下一步中,你使用codegen
命令来生成一个墨西哥人文件从你的入口点函数欧几里得
。
检查运行时问题
你从入口点函数生成一个墨西哥人的功能。一个墨西哥人函数可以从内部调用MATLAB生成的代码。运行墨西哥人函数并检查生成的墨西哥人是否和原来的MATLAB函数有相同的功能。
这是一个最佳实践执行这一步,因为你可以探测和修复中更难诊断运行时错误生成的C代码。默认情况下,墨西哥人功能包括内存完整性检查。这些检查执行数组界限和尺寸检查。内存完整性的检查检测违反代码生成的MATLAB函数。有关更多信息,请参见控制运行时检查。
MATLAB代码转换为有效的C / c++源代码,代码生成器介绍优化,在某些情况下,导致生成的代码的行为不同于原始的源代码。看到生成的代码和MATLAB代码之间的区别。
生成一个墨西哥人申请
euclidean.m
通过使用codegen
命令。验证墨西哥人功能,运行测试脚本测试
与调用MATLAB函数欧几里得
函数调用生成的墨西哥人所取代。codegeneuclidean.marg游戏{x, cb}以及测试
默认情况下,
codegen
生成一个墨西哥人命名函数euclidean_mex
在当前文件夹。您使用
arg游戏
选择指定的入口点函数的样本输入参数欧几里得
。代码生成器使用这些信息来确定输入参数的属性。您使用
以及
选项来运行测试文件test.m
。这个选项取代了电话欧几里得
在调用的测试文件euclidean_mex
。
的输出是:
运行测试文件:“测试”,墨西哥人“euclidean_mex”功能。最接近点的坐标是:0.8 0.8 0.4指数最接近的点是171距离最近的点是0.080374最远的点的坐标是:0 0 1指数最远的点是6距离最远的点是1.2923
欧几里得
。
请注意
生成独立的C / c++代码之前从MATLAB代码,生成一个墨西哥人的功能。运行生成的墨西哥人功能,并确保它与MATLAB函数相同的运行时行为。如果生成的墨西哥人与MATLAB函数产生的答案不同,或产生一个错误,你必须解决这些问题在继续之前独立的代码生成。否则,生成的独立代码可能是不可靠的,未定义的行为。
生成C代码
构建脚本build_lib_fixed.m
包含您所使用的命令来生成代码euclidean.m
。
%负载测试数据负载euclidean_data.mat%为欧几里得生成代码。与codegen m。使用测试数据为例的输入。codegen报告配置:自由euclidean.marg游戏{x, cb}
codegen
读取文件euclidean.m
并将MATLAB代码转换为C代码。的
报告
选项指示codegen
生成代码生成报告,您可以使用它们来调试代码生成问题,并验证您的MATLAB代码适用于代码生成。的
配置:自由
选项指示codegen
生成一个静态C库,而不是生成默认的墨西哥人的功能。的
arg游戏
选项指示codegen
生成的代码euclidean.m
使用类、大小和样例输入参数的复杂性x
和cb
。
而不是生成一个静态库,您可以选择生成一个墨西哥人函数或其他类型的C / c++构建通过使用合适的选项codegen
命令。在各种代码生成选项的更多信息,参见codegen
。
运行构建脚本。
MATLAB处理构建文件并输出信息:
代码生成成功:查看报告。
欧几里得
在
。在这里,工作
\ codegen \ lib \欧几里得
是文件夹,其中包含您的教程文件。工作
在报告中查看器查看代码生成报告,点击查看报告。
如果在代码生成代码生成器检测错误或警告,这份报告描述了问题和提供有问题的MATLAB代码的链接。看到代码生成报告。
提示
使用在命令行构建脚本生成代码。一个构建脚本自动化需要重复执行一系列的MATLAB命令在命令行,节省您的时间和消除输入错误。
比较原始生成的C代码MATLAB代码
比较原始的MATLAB代码生成C代码,打开C文件,euclidean.c
,euclidean.m
在MATLAB文件编辑器。
重要的信息生成的C代码:
函数签名:
空白欧几里得(const双x [3], const双cb[648],双y_min[3],双y_max[3],双idx[2],[2]双距离)
const双x [3]
对应的输入x
在你的MATLAB代码。的大小x
是3
,对应的总大小(3 x 1)示例输入您当您生成的代码用于MATLAB代码。const双cb [648]
对应的输入cb
在你的MATLAB代码。的大小cb
是648年
,对应的总大小(3 x 216)示例输入您当您生成的代码用于MATLAB代码。在这种情况下,生成的代码使用一维数组来表示一个二维数组的MATLAB代码。生成的代码有四个额外的输入参数:数组
y_min
,y_max
,idx
,距离
。这些数组是用来返回的输出值。他们对应的输出参数y_min
,y_max
,idx
,距离
在最初的MATLAB代码。代码生成器保留您的函数名和评论。在可能的情况下,代码生成器保留你的变量名。
请注意
如果一个变量在MATLAB代码设置为一个恒定的值,它不作为一个变量出现在生成的C代码。相反,生成C代码包含变量的实际值。
使用嵌入式编码器®MATLAB代码之间,你可以交互式地跟踪和生成的C / c++代码。看到之间的交互跟踪MATLAB代码和生成的C / c++代码(嵌入式编码)。
为适应输入生成C代码
你生成的C函数euclidean.m
只能接受输入具有相同大小的样本输入期间指定的代码生成。然而,输入数组相应的MATLAB函数可以是任何大小。在这部分的教程中,您将生成C代码euclidean.m
接受适应输入。
假设您想要的尺寸x
和cb
在生成C代码这些属性:
第一个维度
x
和cb
可以大小不同吗3
。第二维度
x
是固定的,有价值吗1
。第二维度
cb
可以大小不同吗216年
。
指定这些输入属性,使用coder.typeof
函数。coder.typeof (A, B, 1)
指定了一个适应输入与同一个类和复杂性一个
和上界由相应的向量元素的大小B
。使用构建脚本build_lib_variable.m
使用coder.typeof
指定属性的适应输入生成的C库。
%负载测试数据负载euclidean_data.mat%使用编码器。typeof指定适应输入eg_x =编码器。typeof (x, [3 1], 1);eg_cb =编码器。typeof (cb [216], 1);%为欧几里得生成代码。使用编码器。typeof指定%上界的例子输入codegen报告配置:自由euclidean.marg游戏{eg_x, eg_cb}
你现在可以生成代码遵循相同的步骤。生成的C代码的函数签名euclidean.c
现在写着:
空白欧几里得(const双x_data [], const int x_size [1], const双cb_data [], const int cb_size[2],双y_min_data [], int y_min_size[1],双y_max_data [], int y_max_size[1],双idx[2],[2]双距离)
x_data
,cb_data
,y_min_data
,y_max_data
对应的输入参数x
和cb
和输出参数y_min
和y_max
在最初的MATLAB函数。现在的C函数接受四个额外的输入参数x_size
,cb_size
,y_min_size
和y_max_size
指定的大小x_data
,cb_data
,y_min_data
,y_max_data
在运行时。
下一个步骤
目标 | 更多的信息 |
---|---|
学习MATLAB代码生成支持内置函数和工具箱函数,类和对金宝app象系统 |
|
生成c++代码 |
|
交互式地创建和编辑输入类型 |
创建和编辑输入类型使用编码器类型编辑器 |
生成和修改一个示例C主要功能和使用它来构建一个可执行程序 |
|
生成的文件打包成一个压缩文件 |
|
优化的执行速度和内存使用生成的代码 |
|
定制的C / c++代码集成到生成的代码 |
|
了解代码生成报告 |
之间的交互跟踪MATLAB代码和生成的C / c++代码(嵌入式编码) |