MATLAB Coder从入门到放弃

一、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.xdnf.cn/news/1076708.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

SHA-512在Go中的实战应用: 性能优化和安全最佳实践

SHA-512在Go中的实战应用: 性能优化和安全最佳实践 简介深入理解SHA-512算法SHA-512的工作原理安全性分析SHA-512与SHA-256的比较结论 实际案例分析数据完整性验证用户密码存储数字签名总结 性能优化技巧1. 利用并发处理2. 避免不必要的内存分配3. 适当的数据块大小总结 与其他…

【玩转408数据结构】线性表——线性表的顺序表示(顺序表)

知识回顾 通过前文,我们了解到线性表是具有相同数据类型的有限个数据元素序列;并且,线性表只是一种逻辑结构,其不同存储形式所展现出的也略有不同,那么今天我们来了解一下线性表的顺序存储——顺序表。 顺序表的定义 …

上个月刚跟男朋友一起买了个三百万的房子,准备明年结婚,这个月他突然被裁了...

职场变动,尤其是裁员,已经成为我们无法忽视的现实。不管你是互联网大佬,还是刚入行的新人,这个问题都可能突如其来,影响到你的生活和计划。 想象一下,你和你的另一半刚刚为了将来的幸福生活,拼尽…

使用 Windows 11/10 上的最佳 PDF 转 Word 转换器释放 PDF 的潜力

毫无疑问,PDF 是最好的文档格式之一,但就像其他格式一样,有时它们确实会带来一些限制。例如,在某些情况下,您可能想要将 PDF 转换为 Word。在这种情况下,您始终可以借助 PDF 到 Word 转换器的帮助。 为了说…

python - 模块使用详解

前言 Python有非常强大的第三方库,也有非常多的内置模块帮助开发人员实现某些功能,无需开发人员自己造轮子。本文介绍Python的模块。 什么是模块 模块简单来说就是一系列功能的集合体,如果将程序的开发比喻成拼图,模块就是各种…

12.atoi函数

文章目录 函数简介函数原型 代码运行 函数简介 函数原型 int atoi(char const *string);函数把字符转化为正数 代码运行 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h>int main() {int ret 0;char str[20] "112233";ret …

Day 43 | 动态规划 1049. 最后一块石头的重量 II 、494. 目标和 、 474.一和零

1049. 最后一块石头的重量 II 题目 文章讲解 视频讲解 思路&#xff1a;dp[j] 表示容量为 j 的背包&#xff0c;最多可以背最大重量为dp[j]。 class Solution {public int lastStoneWeightII(int[] stones) {int sum 0;for (int i 0; i < stones.length; i) {sum stone…

Django模型层part two - 多表关系创建和多表操作

前言 继续上面一篇文章的内容&#xff0c;本文介绍多表操作。使用django ORM可以创建多表关系&#xff0c;并且也支持多张表之间的操作&#xff0c;以创建表关系和查询两部分说明django ORM的多表操作。以作者、图书、出版社和作者信息几张表作为案例进行说明。 创建表关系 …

视觉slam十四讲学习笔记(三)李群与李代数

1. 理解李群与李代数的概念&#xff0c;掌握 SO(3), SE(3) 与对应李代数的表示方式。 2. 理解 BCH 近似的意义。 3. 学会在李代数上的扰动模型。 4. 使用 Sophus 对李代数进行运算。 目录 前言 一、李群李代数基础 1 群 2 李代数的引出 3 李代数的定义 4 李代数 so(3…

Docker笔记-搭建Python环境、安装依赖、打包镜像、导入镜像、编写bash脚本灵活调用

说明 适合无联网的机器及多Python的机器进行部署。 制作docker版Python环境 有网络及有docker的,拉取指定版本的python如: docker pull python:3.7 安装好后进入容器: docker run -it <name> /bin/bash 使用pip安装各种依赖: pip install <name> pip in…

Python访问数据库

目录 SQLite数据库 SQLite数据类型 Python数据类型与SQLite数据类型的映射 使用GUI管理工具管理SQLite数据库 数据库编程的基本操作过程 sqlite3模块API 数据库连接对象Connection 游标对象Cursor 数据库的CRUD操作示例 示例中的数据表 无条件查询 有条件查询 插入…

重学JavaScript高级(十二):async/await-事件循环-面试高频

async/await-事件循环 前面我们学习了生成器和迭代器&#xff0c;那么在本篇文章中&#xff0c;我们主要讲解生成器与Promise的结合使用&#xff0c;从而引出async/await语法&#xff0c;同时会涉及面试中频次最高的一个知识点&#xff1a;事件循环 生成器与异步处理 首先需要…

【Chrono Engine学习总结】4-vehicle-4.1-vehicle的基本概念

由于Chrono的官方教程在一些细节方面解释的并不清楚&#xff0c;自己做了一些尝试&#xff0c;做学习总结。 1、基本介绍 Vehicle Overview Vehicle Mannel Vehicle的官方demo 1.1 Vehicle的构型 一个车辆由许多子系统构成&#xff1a;悬挂、转向、轮子/履带、刹车/油门、动…

搜索专项---最短路模型

文章目录 迷宫问题武士风度的牛抓住那头牛 一、迷宫问题OJ链接 本题思路:只需要记录各个点是有哪个点走过来的&#xff0c;就能递推得出路径。记录前驱假设从 1,1 这个点向下走到了2, 1&#xff0c;则将2,1这个点的前驱记为1,1。这样&#xff0c;将整张地图 bfs 后&#xff0c…

C++进阶(十五)C++的类型转换

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、C语言中的类型转换二、为什么C需要四种类型转换三、C强制类型转换1、static_cast2、reint…

【必看】Onlyfans如何使用搜索功能?Onlyfans如何搜索博主?如何在OnlyFans搜索HongkongDoll

1. 什么是Onlyfans OnlyFans是一种内容订阅服务平台&#xff0c;它成立于2016年。 它允许内容创作者在平台上面分享自己的创作&#xff0c;如图片、视频等等&#xff0c;用户需要支付订阅费用才能查看创作者的内容。此外&#xff0c;用户还可以通过打赏的方式来让创作者为自己…

[Python进阶] 制作动态二维码

11.1 制作动态二维码 二维码&#xff08;QR code&#xff09;是一种二维条形码&#xff08;bar code&#xff09;&#xff0c;它的起源可以追溯到20世纪90年代初。当时&#xff0c;日本的汽车工业开始使用一种被称为QR码的二维条码来追踪汽车零部件的信息。 QR码是Quick Respo…

代码随想录算法训练营Day55|392.判断子序列、115.不同的子序列

目录 392.判断子序列 思路 ​算法实现 115.不同的子序列 思路 算法实现 总结 392.判断子序列 题目链接 文章链接 思路 利用动规五部曲进行分析&#xff1a; 1.确定dp数组及其下标含义&#xff1a; dp[i][j] 表示以下标i-1为结尾的字符串s&#xff0c;和以下标j-1为结尾的…

controlnet的模型下载

controlnet模型有sd15和基于sd15上的fp16版本 fp16版本的模型比较小&#xff0c;但功能效果跟sd15是一样的 controlnet的fp16模型下载地址 https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/tree/main controlnet的openpose里&#xff0c;有个dw_open…