MATLAB Coder从入门到放弃

news/2024/11/28 5:47:48/

一、MATLAB Coder入门

1 MATLAB Coder是什么

从 MATLAB 代码生成 C 和 C++ 代码

MATLAB® Coder™ 可从 MATLAB 代码生成适用于各种硬件平台(从桌面计算机系统到嵌入式硬件)的 C 和 C++ 代码。它支持大多数 MATLAB 语言和广泛的工具箱。您可以将生成的代码作为源代码、静态库或动态库集成到您的工程中。生成的代码是可读且可移植的。您可以将它与现有 C 和 C++ 代码及库的关键部分结合使用。您还可以将生成的代码打包为 MEX 函数以在 MATLAB 中使用。

与 Embedded Coder® 结合使用时,MATLAB Coder 可提供代码自定义、特定于目标的优化、代码可追溯性以及软件在环 (SIL) 和处理器在环 (PIL) 验证。

要将 MATLAB 程序部署为独立应用程序,请使用 MATLAB Compiler™。要生成与其他编程语言集成的软件组件,请使用 MATLAB Compiler SDK™。

2 配置准备

设置 C 或 C++ 编译器

MATLAB® Coder™ 将自动查找并使用支持的已安装编译器。有关受支持编译器的当前列表,请参阅 MathWorks® 网站上的支持和兼容的编译器。

可以使用 mex -setup 更改默认编译器。请参阅更改默认编译器。如果您生成 C++ 代码,请参阅选择 C++ 编译器。

参考链接:更改默认编译器 - MATLAB & Simulink - MathWorks 中国

Windows系统下在 MATLAB 命令提示符下键入:mex -setup

在这里插入图片描述

3 生成代码的三种方式

  • 使用 MATLAB Coder App 生成 C 代码

    使用 MATLAB Coder App 从 MATLAB 代码生成 C/C++ 代码。

  • 通过命令行生成 C 代码

    使用 codegen 命令从 MATLAB 代码生成 C/C++ 代码。

  • 通过生成 MEX 函数加快 MATLAB 算法的执行速度

    通过使用 codegen 命令从 MATLAB 函数生成 MEX 函数。

3.1 使用 MATLAB Coder App 生成 C 代码

例子中euclidean的例子非常具有代表性:

  • 多输入多输出
  • 有数据文件mat
  • 有读取文件

其中的注意点:

  • 代码生成器筛查
    在函数声明后面添加 %#codegen 指令:
    function [y,idx,distance] = euclidean(x,cb) %#codegen

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

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

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

  • 该 App 将使用默认名称 euclidean.prj在当前文件夹中创建一个工程。

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

  • 要查看行执行计数,请点击 View MATLAB line execution counts。

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

  • 代码比较

    在这里插入图片描述

  • 如果您想为可变大小输入生成 C 代码

    在这里插入图片描述

3.2 通过命令行生成 C 代码

过程要点:

  • 使用 codegen 命令生成 MEX 函数:codegen sobel

    在生成 C 代码之前,应首先在 MATLAB 中测试 MEX 函数,以确保它在功能上等同于原始 MATLAB 代码,并且不会出现任何运行时错误。默认情况下,codegen 在当前文件夹中生成名为 sobel_mex 的 MEX 函数。这允许您测试 MATLAB 代码和 MEX 函数,并将结果进行比较。

  • 生成独立 C 代码:codegen -config coder.config('lib') sobel

    将 codegen 与 -config coder.config(‘lib’) 选项结合使用生成独立 C 库。默认情况下,为库生成的代码位于文件夹 codegen/lib/sobel/ 中。

3.3 通过生成 MEX 函数加快 MATLAB 算法的执行速度

4 一些注意点

4.1 代码生成工作流

在这里插入图片描述

4.2 代码生成的输入类型设定

在这里插入图片描述

介绍了3种典型数据类型的设定方式。

4.3 生成代码和 MATLAB 代码的形式差异

5 官方Examples

平均值滤波器 - MATLAB & Simulink - MathWorks 中国

生成 C 代码:codegen -config coder.config('lib') averaging_filter -args {x}

二、进阶注意事项

1 用于代码生成的 MATLAB 编程

MATLAB Coder™ 支持大多数 MATLAB 语言以及您在 MATLAB 算法中使用的许多工具箱函数和 System object。要生成 C/C++ 代码,请遵循代码生成的编程要求和最佳做法。

主要有以下几点组成:

  • ~~有关代码生成的编程注意事项
    有关代码生成的 MATLAB 编程注意事项;生成的代码的行为~~
  • ~~语言、函数和对象支持
    支持 C 和 C++ 代码生成的 MATLAB 语言功能、函数、类和 System object~~
  • 数据定义
    针对代码生成的数据定义方式与 MATLAB 有何不同
  • 函数定义
    为代码生成定义和调用函数

主要留意函数定义部分的3个函数:[coder.ignoreConst](https://ww2.mathworks.cn/help/releases/R2020b/coder/ref/coder.ignoreconst.html) [coder.ignoreSize](https://ww2.mathworks.cn/help/releases/R2020b/coder/ref/coder.ignoresize.html) [coder.extrinsic](https://ww2.mathworks.cn/help/releases/R2020b/coder/ref/coder.extrinsic.html)

2 代码生成

C/C++ 代码生成是 MATLAB® Coder™ 的核心功能。您可以使用 coder 函数打开 App 以生成代码,也可以使用 codegen 函数从命令行生成代码。

2.1 重点函数列表

  • **coder.target **

例子如下:

function y = callmyabsval(y)  
%#codegen
% Check the target. Do not use coder.ceval if callmyabsval is
% executing in MATLAB
if coder.target('MATLAB')    %这里指的是直接调用此函数% Executing in MATLAB, call function myabsvaly = myabsval(y);
else %并非在matlab中调用此函数% add the required include statements to generated function codecoder.updateBuildInfo('addIncludePaths','$(START_DIR)\codegen\lib\myabsval');coder.cinclude('myabsval_initialize.h');coder.cinclude('myabsval.h');coder.cinclude('myabsval_terminate.h');% Executing in the generated code. % Call the initialize function before calling the % C function for the first timecoder.ceval('myabsval_initialize');% Call the generated C library function myabsvaly = coder.ceval('myabsval',y);% Call the terminate function after% calling the C function for the last timecoder.ceval('myabsval_terminate');
end

在这个案例中着重一并介绍了使用 coder.ceval调用生成的 C 库函数,以及一些外部代码集成的应用比如[coder.cinclude](https://ww2.mathworks.cn/help/releases/R2020b/coder/ref/coder.cinclude.html)


http://www.ppmy.cn/news/1353670.html

相关文章

Python setattr函数

在Python编程中,setattr()函数是一个有用且灵活的内置函数,用于设置对象的属性值。它可以在运行时动态地设置对象的属性,无论是新建对象还是已有对象。本文将深入探讨setattr()函数的用法、语法、示例代码,并探讨其在实际编程中的…

Spring AMQP(3.1.1)设置ConfirmCallback和ReturnsCallback

文章目录 一、起因二、代码1. 定义exchange和queue2. RabbitTemplate3. EnhancedCorrelationData4. 发送消息 环境如下 VersionSpringBoot3.2.1spring-amqp3.1.1RabbitMq3-management 一、起因 老版本的spring-amqp在CorrelationData上设置ConfirmCallback。但是今天却突然发…

洛谷: P1480 A/B Problem

题目描述 输入两个整数 a , b a,b a,b,输出它们的商。 输入格式 两行,第一行是被除数,第二行是除数。 输出格式 一行,商的整数部分。 样例 #1 样例输入 #1 10 2样例输出 #1 5提示 0 ≤ a ≤ 1 0 5000 0\le a\le 10^{500…

openJudge | 循环移动 C语言

总时间限制: 1000ms 内存限制: 65536kB 描述 给定一组整数,要求利用数组把这组数保存起来,再利用指针实现对数组中的数循环移动。假定共有n个整数,则要使前面各数顺序向后移m个位置,并使最后m各数变为最前面的m各数。 注意&…

CSS设置盒子阴影

语法 box-shadow: *h-shadow v-shadow blur spread color* inset; 注释: box-shadow向框添加一个或多个阴影. 该属性是由逗号分隔的阴影列表,每个阴影由2-4个长度值、可选的颜色值及可选的inset关键词来规定。省略长度的值是0。 外阴影 a、给元素右边框和下边框加外阴影——把…

关于Swin Transformer的架构记录

Swin Transformer 可以说是批着Transformer外表的卷积神经网络。 具体的架构如下图所示: 首先我们得到一张224*224*3的图片。 通过分成4*4的patch,变成了56*56*48。 线性变换后又变成了56*56*96。 然后利用了Swin Transformer中一个比较特别的结构 P…

鸿蒙系统优缺点,能否作为开发者选择

凡是都有对立面,就直接说说鸿蒙的优缺点吧。 鸿蒙的缺点: 鸿蒙是从2019年开始做出来的,那时候是套壳Android大家都知晓。从而导致大家不看鸿蒙系统,套壳Android就是多次一举。现在鸿蒙星河版已经是纯血鸿蒙,但是它的…

CSS篇--transform

CSS篇–transform 使用transform属性实现元素的位移、旋转、缩放等效果 位移 // 语法 transform:translate(水平移动距离,垂直移动距离) translate() 如果只给一个值,表示x轴方法移动距离 单独设置某个方向的移动距离:translateX() transla…