目录

使用 MATLAB Coder App 生成 C 代码

教程文件

为 MATLAB 函数生成 C 代码

运行原始 MATLAB 代码

使 MATLAB 代码适用于代码生成

打开 MATLAB Coder App 并选择源文件

定义输入类型

检查运行时问题

生成 C 代码

查看 Finish Workflow 页面

将生成的 C 代码与原始 MATLAB 代码进行比较

为可变大小输入生成 C 代码

接下来的步骤


使用 MATLAB Coder App 生成 C 代码

​        在本教程中,将使用 MATLAB® Coder™ App 为 MATLAB 函数生成一个静态 C 库。首先生成只能接受具有固定预分配大小的输入的 C 代码。然后生成可以接受许多不同大小的输入的 C 代码。

还可以使用 codegen 命令在 MATLAB 命令行中生成代码。

MATLAB Online™ 不支持 MATLAB Coder App。要在 MATLAB Online 中生成 C/C++ 代码,请使用 codegen 命令。

教程文件

将教程文件从文件夹 matlabroot\help\toolbox\coder\examples\euclidean 复制到本地工作文件夹。此处,matlabroot 是 MATLAB 安装文件夹,例如 C:\Program Files\MATLAB\R2019a。要将这些文件复制到当前文件夹,请运行以下 MATLAB 命令:

copyfile(fullfile(matlabroot,'help','toolbox','coder','examples','euclidean'))

本地工作文件夹不能为私有文件夹或 @ 文件夹。本教程使用 euclidean_data.mat、euclidean.m 和 test.m 文件。

  • MATLAB 数据文件 euclidean_data.mat 包含两段数据:三维欧几里德空间中的一个点以及三维欧几里德空间中的一组其他点。更具体地说:

    • x 是一个 3×1 列向量,表示三维欧几里德空间中的一个点。

    • cb 是一个 3×216 数组。cb 中的每列都表示三维欧几里德空间中的一个点。

  • MATLAB 文件 euclidean.m 包含 euclidean 函数,该函数在本示例中实现核心算法。该函数接受 x 和 cb 作为输入。它计算 x 和 cb 中每个点之间的欧几里德距离,并返回以下量:

    • 列向量 y_min,它等于 cb 中表示与 x 距离最近的点的列。

    • 列向量 y_max,它等于 cb 中表示与 x 距离最远的点的列。

    • 二维向量 idx,它包含 cb 中向量 y_min 和 y_max 的列索引。

    • 二维向量 distance,它包含计算出的到 x 的最小和最大距离。

function [y_min,y_max,idx,distance] = euclidean(x,cb)
% Initialize minimum distance as distance to first element of cb
% Initialize maximum distance as distance to first element of cb
idx(1)=1;
idx(2)=1;distance(1)=norm(x-cb(:,1));
distance(2)=norm(x-cb(:,1));% Find the vector in cb with minimum distance to x
% Find the vector in cb with maximum distance to x
for index=2:size(cb,2)d=norm(x-cb(:,index));if d < distance(1)distance(1)=d;idx(1)=index;endif d > distance(2)distance(2)=d;idx(2)=index;end
end% Output the minimum and maximum distance vectors
y_min=cb(:,idx(1));
y_max=cb(:,idx(2));end
  • MATLAB 脚本 test.m 将数据文件 euclidean_data.mat 加载到工作区中。接着,它调用函数 euclidean 来计算 y_min、y_max、idx 和 distance。然后,脚本在命令行中显示计算出的量。
  • 加载 euclidean_data.mat 是在调用核心算法之前执行的预处理步骤。显示结果是后处理步骤。
% Load test data
load euclidean_data.mat% Determine closest and farthest points and corresponding distances
[y_min,y_max,idx,distance] = euclidean(x,cb);% Display output for the closest point
disp('Coordinates of the closest point are: ');
disp(num2str(y_min'));
disp(['Index of the closest point is ', num2str(idx(1))]);
disp(['Distance to the closest point is ', num2str(distance(1))]);disp(newline);% Display output for the farthest point
disp('Coordinates of the farthest point are: ');
disp(num2str(y_max'));
disp(['Index of the farthest point is ', num2str(idx(2))]);
disp(['Distance to the farthest point is ', num2str(distance(2))]);

提示:可以使用 MATLAB Coder 从 MATLAB 函数生成代码。不支持从 MATLAB 脚本生成代码。

请使用测试脚本将预处理和后处理步骤与实现核心算法的函数分隔开。这种做法能够轻松地重用您的算法。需要为实现核心算法的 MATLAB 函数生成代码。不需要为测试脚本生成代码。

为 MATLAB 函数生成 C 代码

运行原始 MATLAB 代码

在 MATLAB 中运行测试脚本 test.m。输出显示 y、idx 和 distance。

Coordinates of the closest point are:
0.8         0.8         0.4
Index of the closest point is 171
Distance to the closest point is 0.080374Coordinates of the farthest point are:
0  0  1
Index of the farthest point is 6
Distance to the farthest point is 1.2923

使 MATLAB 代码适用于代码生成

MATLAB 编辑器中的代码分析器会在您输入代码时持续检查代码。它会报告问题,并提出修改建议,以最大程度地提高性能和可维护性。

  1. 在 MATLAB 编辑器中打开 euclidean.m。MATLAB 编辑器右上角的代码分析器消息指示标记为绿色。分析器未在代码中检测到错误、警告或改进机会。

  2. 在函数声明后面添加 %#codegen 指令:

    function [y,idx,distance] = euclidean(x,cb) %#codegen

    %#codegen 指令提示代码分析器识别特定于代码生成的警告和错误。

    代码分析器消息指示标记变为红色,表示它检测到代码生成问题。

  3. ​要查看警告消息,请将光标移到带下划线的代码片段上。警告指示,代码生成要求先对变量 idx 和 distance 进行完全定义,然后才可以对它们进行下标索引。出现这些警告是因为代码生成器必须在这些变量在代码中首次出现时确定其大小。要解决此问题,请使用 ones 函数同时分配和初始化这些数组。

    % Initialize minimum distance as distance to first element of cb
    % Initialize maximum distance as distance to first element of cb
    idx = ones(1,2);distance = ones(1,2)*norm(x-cb(:,1));

    代码分析器消息指示标记再次变为绿色,表示它没有再检测到任何代码生成问题。

  4. 保存文件。

    现在即可使用 MATLAB Coder App 编译您的代码。此处,编译指从MATLAB 代码生成 C/C++ 代码。

注意:编译 MATLAB 代码指从 MATLAB 代码生成 C/C++ 代码。在其他情况下,“编译”可能指 C/C++ 编译器的操作。

打开 MATLAB Coder App 并选择源文件

  1. 在 MATLAB 工具条的 App 选项卡上,点击 Code Generation 下的 MATLAB Coder App 图标。该 App 会打开 Select Source Files 页面。

  2. 在 Select Source Files 页面中,输入或选择入口函数 euclidean 的名称。入口函数是顶层 MATLAB 函数,可以从中生成代码。该 App将使用默认名称 euclidean.prj 在当前文件夹中创建一个工程。

  3. 点击 Next 以转到 Define Input Types 步骤。App 对入口函数运行代码分析器(您已在前面的步骤中运行过)和代码生成就绪工具。代码生成就绪工具会筛查 MATLAB 代码中是否存在代码生成不支持的功能和函数。如果 App 发现问题,它将打开 Review Code Generation Readiness 页面,您可以在其中查看和解决问题。在此示例中,由于 App 没有检测到问题,因此将打开 Define Input Types 页面。

    注意:代码分析器和代码生成就绪工具可能无法检测到所有代码生成问题。消除这两个工具检测到的错误或警告后,请使用 MATLAB Coder 生成代码,以确定MATLAB 代码是否存在其他合规性问题。

C/C++ 代码生成支持的某些 MATLAB 内置函数和工具箱函数、类以及 System object 有特定的代码生成限制。这些限制和相关使用说明列在其对应参考页的扩展功能部分。

定义输入类型

由于 C 使用静态类型,因此在代码生成时(也称为编译时),代码生成器必须确定 MATLAB 文件中所有变量的类、大小和复/实性。因此,必须指定所有入口函数输入的属性。要指定输入属性,可以:

  • 指示 App 通过提供使用样本输入调用入口函数的脚本来自动确定输入属性。

  • 直接指定属性。

在此示例中,要定义输入 x 和 cb 的属性,请指定测试文件 test.m,代码生成器使用该文件来自动定义类型:

  1. 输入或选择测试文件 test.m。

  2. 点击 Autodefine Input Types

    测试文件 test.m 会使用预期的输入类型调用入口函数 euclidean。App 确定输入 x 为 double(3x1),输入 cb 为 double(3x216)。

  3. 点击 Next 以转到 Check for Run-Time Issues 步骤。

检查运行时问题

        Check for Run-Time Issues 步骤从入口函数生成 MEX 文件,然后运行 MEX 函数并报告问题。MEX 函数是可从 MATLAB 内部调用的生成的代码。执行此步骤是一个很好的做法,因为可以检测并解决在生成的 C 代码中更难诊断出来的运行时错误。默认情况下,MEX函数包括内存完整性检查。这些检查执行数组边界和维度检查,还检测为 MATLAB 函数生成的代码中是否存在内存完整性冲突问题。

为了将 MATLAB 代码转换为高效的 C/C++ 源代码,代码生成器引入了优化,在某些情况下,这会导致生成的代码与原始源代码在行为上有所不同。

  1. 要打开 Check for Run-Time Issues 对话框,请点击 Check for Issues 箭头 

  2. 在 Check for Run-Time Issues 对话框中,指定测试文件,或输入使用示例输入调用入口函数的代码。对于此示例,请使用来定义输入类型的测试文件 test。

  3. 点击 Check for Issues

    App 将生成一个 MEX 函数。它运行测试脚本 test,将对 euclidean 的调用替换为对生成的 MEX 的调用。如果 App 在 MEX 函数生成或执行过程中检测到问题,它将提供警告和错误消息。可以点击这些消息,导航到有问题的代码并修复问题。在本示例中,App 未检测到问题。

  4. 默认情况下,该 App 会收集行执行计数。这些计数有助于了解测试文件 test.m 执行 euclidean 函数的效果。要查看行执行计数,请点击 View MATLAB line execution counts。App 编辑器在代码左侧显示彩色条。要将彩色突出显示扩展到代码并查看行执行计数,请将光标放在彩色条上。

    特定绿色底色表示此代码的行执行计数落在特定范围内。在本例中,for 循环执行 215 次。有关如何解释行执行计数和关闭计数集合的信息。

  5. 点击 Next 以转到 Generate Code 步骤。

注意:在从MATLAB 代码生成独立的 C/C++ 代码之前,请生成 MEX 函数。运行生成的 MEX 函数,并确保它具有与您的 MATLAB 函数相同的运行时行为。如果生成的 MEX 函数的执行结果不同于 MATLAB 的结果,或者出错,必须先修复这些问题,然后生成独立的代码。否则,生成的独立代码可能不可靠并且具有未定义的行为。

生成 C 代码

  1. 要打开 Generate 对话框,请点击 Generate 箭头 

  2. 在 Generate 对话框中,将 Build type 设置为“Static Library (.lib)”, 将 Language 设置为 C。对其他工程编译配置设置使用默认值。

    可以选择生成 MEX 函数或其他 C/C++ 编译类型,而不是生成 C 静态库。MEX 和 C/C++ 编译类型可使用不同工程设置。当MEX 和 C/C++ 代码生成之间切换时,请确认您选择的设置。

  3. 点击 Generate

    MATLAB Coder 会在 work\codegen\lib\euclidean 中生成独立的 C 静态库 euclidean。work 是包含教程文件的文件夹。MATLAB Coder App 指示代码生成成功。它在页面左侧显示源 MATLAB 文件和生成的输出文件。在 Variables 选项卡上,它显示有关 MATLAB 源变量的信息。在 Target Build Log 选项卡上,它会显示编译日志,包括 C/C++ 编译器警告和错误。默认情况下,在代码窗口中,该 App 将显示 C 源代码文件 euclidean.c。要查看不同的文件,请在 Source Code 或 Output Files 窗格中,点击文件名称。

  4. 点击 View Report 在 Report Viewer 中查看报告。如果代码生成器在代码生成过程中检测到错误或警告,报告将说明问题并提供有问题的 MATLAB 代码的链接。

  5. 点击 Next 打开 Finish Workflow 页面。

查看 Finish Workflow 页面

        Finish Workflow 页面指示已成功生成代码,它提供工程摘要以及指向生成的输出的链接。

将生成的 C 代码与原始 MATLAB 代码进行比较

要将生成的 C 代码与原始 MATLAB 代码进行比较,请在 MATLAB 编辑器中打开 C 文件 euclidean.c 和 euclidean.m 文件。

关于生成的 C 代码的重要信息:

  • 函数签名为:

    void euclidean(const double x[3], const double cb[648], double y_min[3], doubley_max[3], double idx[2], double distance[2])

    const double x[3] 对应于MATLAB 代码中的输入 x。x 的大小为 3,对应于从 MATLAB 代码生成代码时使用的示例输入的总大小 (3×1)。

    const double cb[648] 对应于MATLAB 代码中的输入 cb。cb 的大小为 648,对应于从MATLAB代码生成代码时使用的示例输入的总大小 (3×216)。在本例中,生成的代码使用一维数组来表示 MATLAB 代码中的二维数组。

    生成的代码有四个额外的输入参数:数组 y_min、y_max、idx 和 distance。这些数组用于返回输出值。它们对应于原始 MATLAB 代码中的输出参数 y_min、y_max、idx 和 distance。

  • 代码生成器将保留函数名称和注释。如果可能,代码生成器会保留您的变量名称。

    注意:如果MATLAB 代码中的某个变量设置为常量值,它在生成的 C 代码中将不会显示为变量。在这种情况下,生成的 C 代码将包含该变量的实际值。

为可变大小输入生成 C 代码

为 euclidean.m 生成的 C 函数只能接受在代码生成期间指定的样本输入具有相同大小的输入。但是,对应的 MATLAB 函数的输入数组可以具有任意大小。在本教程的此部分,您将从 euclidean.m 中生成接受可变大小输入的 C 代码。

假设希望生成的 C 代码中的 x 和 cb 的维度具有以下属性:

  • x 和 cb 的第一个维度的大小为可变大小,但不超过 3。

  • x 的第二个维度具有固定大小,其值为 1。

  • cb 的第二个维度的大小为可变大小,但不超过 216。

要指定这些输入属性,请执行以下操作:

  1. 在 Define Input Types 步骤中,像以前一样输入测试文件 test.m,然后点击 Autodefine Input Types。测试文件使用预期的输入类型调用入口函数 euclidean.m。App 确定输入 x 为 double(3x1),输入 cb 为 double(3x216)。这些类型指定固定大小的输入。

  2. 点击输入类型设定并编辑它们。可以通过使用 : 前缀来指定可变大小,最高不超过指定的限制。例如,:3 表示对应维度具有可变大小,但不超过 3。将 x 的类型更改为 double(:3 x 1),将 cb 的类型更改为 double(:3 x :216)。

现在,可以按照与以前相同的步骤生成代码。euclidean.c 中生成的C代码的函数签名现在为:

void euclidean(const double x_data[], const int x_size[1], const double cb_data[],const int cb_size[2], double y_min_data[], int y_min_size[1],double y_max_data[], int y_max_size[1], double idx[2], doubledistance[2])

参数 x_data、cb_data、y_min_data 和 y_max_data 对应于原始 MATLAB 函数中的输入参数 x 和 cb 以及输出参数 y_min 和 y_max。现在,C 函数接受四个额外的输入参数,即 x_size、cb_size、y_min_size 和 y_max_size,它们在运行时指定 x_data、cb_data、y_min_data 和 y_max_data 的大小。

接下来的步骤

目的 更多信息

了解对 MATLAB 内置函数和工具箱函数、类和 System object 的代码生成支持

C/C++代码生成支持的函数和对象

生成 C++ 代码

C++代码生成

生成并修改示例 C 主函数,并使用它来编译 C 可执行程序

在应用程序中使用示例C主函数

将生成的文件打包为压缩文件

Package Code for Other Development Environments

优化所生成的代码的执行速度或内存使用量。

优化策略

将自定义 C/C++ 代码集成到生成的代码中

从MATLAB代码调用C/C++代码

了解代码生成报告

Code Generation Reports Interactively Trace Between MATLAB Code and Generated (Embedded Coder)

使用 MATLAB Coder App 生成 C 代码相关推荐

  1. 使用 MATLAB Coder App生成MEX函数

    目录 使用 MATLAB Coder App 生成 MEX 函数的工作流 使用 MATLAB Coder App 生成 MEX 函数 配置工程设置 编译 MATLAB Coder 工程 使用 MATL ...

  2. Matlab/Simulink自动生成C代码实验

    目录 0. 概要 1. Matlab /Simulink/Embedded Coder关系与区别 2. 搭建Simulink模型及仿真 2.1 搭建模型 2.2 仿真 3. 生成代码 3.1 求解器设 ...

  3. Matlab 2019b simulink 生成C代码(二)用fixed point tool 生成定点代码

    一.简介 本文主要以matlab 2019b版本,主要讲解怎么用simulink和fixed point tool生成嵌入式定点c代码: 在嵌入式代码设计中,由于浮点运算特别占用CPU资源,我们通常使 ...

  4. Matlab/Simulink自动生成STM32代码_基于模型的开发_环境搭建

    目录 前言 官方简介 Matlab R2018b安装 STM32-MAT/TARGET 安装 STM32CubeMX 安装 STM32CubeIDE, Keil安装 ST-Link驱动安装 微信公众号 ...

  5. Matlab 2019b simulink 生成C代码(一)

    一.简介 本文主要以matlab 2019b版本,主要讲解怎么用simulink生成嵌入式c代码: 1.设置生成嵌入式C代码: 2.生成自己想要变量代码: 3.生成自定义名称函数 二.具体实现方法 1 ...

  6. matlab中不能找到ccs,搭建matlab连接ccs生成28335代码的环境(路径不在C盘)

    ps:一周每天下班熬到一两点就整这个了.所谓笨鸟先飞,写个博客一起起飞,其中不足之处还请指正. 首先装文件目录: ccs5.5版本(CCS5.5.0.00077_win32) 安装在ccs目录下的: ...

  7. 使用MATLAB Coder将工具箱中的系统对象转换为C代码

    使用MATLAB Coder将工具箱中的系统对象转换为C代码 现在你一个脚本文件,这个文件是个完整的程序,有输入也有输出,运行这个脚本文件会得到你想要的结果.在这个文件里你使用了某个工具箱中的系统对象 ...

  8. 基于MATLAB Coder将matlab代码转换成C代码

    MATLAB Coder可以从MATLAB代码生成独立的.可读性强.可移植的C/C++代码.本文基于matlab2015a编制,但是也适用于matlab 2014~2016的版本. 1. 使用MATL ...

  9. Matlab代码转换为C重要步骤(Matlab coder (2021a))

    Matlab转换为C 自动匹配函数入口参数类型时,需要提前把测试函数跑一遍. Matlab coder (2021a)生成C文件精简方法: 1.把设置中的Speed选项中Saturate on int ...

  10. 举例说明使用MATLAB Coder从MATLAB生成C/C++代码步骤

    MATLAB Coder可以从MATLAB代码生成独立的.可读性强.可移植的C/C++代码. 使用MATLAB Coder产生代码的3个步骤:准备用于产生代码的MATLAB算法:检查MATLAB代码的 ...

最新文章

  1. 使用CSS3的appearance属性改变元素的外观
  2. 【采用】【科技金融】CART树现金贷风控策略
  3. Matlab自定义函数的几种方法
  4. CCNP学习笔记2-路由部分--EIGRP
  5. c++ 线程什么时候run_阿里后端Java面试题:启动线程是start()还是run()?为什么?...
  6. Matlab与线性代数
  7. 怎么开启队友无伤_和平精英暗夜危机无敌点位送上!不仅无伤打僵尸 敌人还看不到你...
  8. win7 java jna找不到_java – 资源路径中找不到JNA本机支持(/com/sun/jna/linux-arm/libjnidispatch.so)...
  9. ARP攻击原理简析及防御措施
  10. qt读oracle时间戳,QT解析时间戳与微秒级精度
  11. Maven里头的pom.xml配置详解
  12. Xv6 Page Table
  13. 计算机具有逻辑思维,逻辑思维能力
  14. 写了一个内核模块实现简单的类似ps命令.
  15. c语言spoc测验成绩比重,SPOC混合教学模式在C语言程序设计课程的应用
  16. 全网首发!!C++20新特性全在这一张图里了
  17. 马槊, 在古代是将领身份的象征
  18. 图卷积神经网络(GCN)综述与实现(PyTorch版)
  19. 荣耀50手机系列正式发布,售价2399元起,主要竞争对手瞄准苹果
  20. Filament介绍

热门文章

  1. Java并发练习:exchange简单使用
  2. js获取某月的天数以及某天的前一个日期和后一天日期
  3. 读取照片的Exif信息
  4. Centos 6 版本下载
  5. 量子计算机物理学,一片“蓝海”:量子计算机的灿烂前景
  6. 微信公众号网页开发和小程序开发之路
  7. 【转】卖萌的大牛你桑不起啊 ——记CVPR2011一篇极品文章
  8. Solidity----状态修饰符view、pure
  9. 单价数量和总价的公式_总价数量单价的数量关系式
  10. 订单操作-订单详情查询代码实现