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

2023-11-16

 MATLAB Coder可以从MATLAB代码生成独立的、可读性强、可移植的C/C++代码。

使用MATLAB Coder产生代码的3个步骤:准备用于产生代码的MATLAB算法;检查MATLAB代码的兼容性(有些matlab代码语句并不能生成c/c++代码);产生最终使用的源代码或MEX。

利用MATLAB Coder生成c++代码,并在vs2008中验证:

一个简单的例子,两数相乘

1、安装matlab2011a或者更新版本;

2、简单生成一个foo.m文件;

function c = foo(a, b)%#codegen

%This function muliplies a and b

c = a * b

其中,%#codegen可以防止出现警告错误

3、在命令窗口,输入mex -setpu,选中一个存在的编译器;

4、在命令窗口输入coder(图形界面),回车,弹出MATLAB Coder Project对话框;

5、在New选项卡Name中输入一个工程名foo.prj;点击Ok,弹出MATLAB Coder MEX Function对话框;

6、在Overview选项卡中,点击Add files,弹出对话框,选中foo.m打开;

7、单击变量a,选择Define by Example…,弹出MATLAB Coder Define by Example对话框,在MATLAB Expression中输入5,点击OK;同样变量b也进行相应操作,输入6;

8、选中Build选项卡,Output type中选择c/c++ Static Library;选中Generate code only;

9、点击More settings,GeneralàLanguage选择C++;Interface选项中去掉所有选项;Close;

10、点击Build,进行编译;点击View report,弹出Code Generation Report对话框,此时,变量a、b、c会显示相应的变量信息;

11、利用vs2008建立一个控制台应用程序,将生成的相关文件foo.h、foo.cpp、rtwtypes.h、foo_types.h拷到相关目录下并添加到应用程序中;

12、在foo.cpp文件中添加#include “stdafx.h”;

13、test.cpp文件中代码为:

#include "stdafx.h"

#include "foo.h"

#include <iostream>

 

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[])

{

 

    double a = 0.0, b = 0.0, c = 0.0;

 

    cin>>a>>b;

 

    c = foo(a, b);

 

    cout<<"c = "<<c<<endl;

 

    return 0;

}

 

一个复杂的例子,求一个数的n次方根

1、  两个.m文件:

nrt.m:

function [nth_rt, iterations, hstry] = nrt(varargin)%#codegen

%This function will use a Newton Search Technique to find

%the nth root of a number, a, to the tolerance, tol.

%The square root

% nrt(10, 2), or nrt(10, 2, 1e-9)

%The "n" root

%nrt(10, n), or nrt(10, n, 1e-9)

 

a = varargin{1};

n = varargin{2};

 

if nargin ~= 3

    tol = 1e-9;

else

    tol = varargin{3};

end

 

if a < 0

    nth_rt = 0;

    iterations = 0;

    hstry = 0;

else

    [nth_rt, hstry] = newtonSearchAlgorithm(a, n, tol);

    iterations = length(find(hstry ~= 0));

    %iterations = sum(hstry ~= 0);

end

 

newtonSearchAlgorithm.m

function [x, h] = newtonSearchAlgorithm(b, n, tol) %#codegen

%Given, "a", this function finds the nth root of a

%number by finding where: x^n-a = 0

coder.inline('never'); %使其生成一个单独的c++文件

notDone = 1;

aNew    = 0; %Refined Guess Initialization

a       = 1; %Initial Guess

cnt     = 0;

h = zeros(50, 1);

h(1)    = a;

while notDone

    cnt = cnt + 1;

    [curVal, slope] = f_and_df(a, b, n); %  square

    yint = curVal - slope * a;

    aNew = -yint / slope; %The new guess

    h(cnt) = aNew;

    if (abs(aNew-a) < tol) %Break if it's converged

        notDone = 0;

    elseif cnt > 49 %after 50 iterations, stop

        notDone = 0;

        aNew = 0;

    else

        a = aNew;

    end

end

x = aNew;

 

function [f, df] = f_and_df(a, b, n)

%Our function is f=a^n-b and it's derivative is n*a^(n-1).

 

f  = a^n-b;

df = n*a^(n-1);

 

2、  在命令窗口输入coder(图形界面),回车,弹出MATLAB Coder Project对话框;

3、在New选项卡Name中输入一个工程名nrt.prj;点击Ok,弹出MATLAB Coder MEX Function对话框;

4、在Overview选项卡中,点击Add files,弹出对话框,选中nrt.m打开;

5、添加三个输入,分别为10、2、1e-9;两个输入也可以;

6、选中Build选项卡,Output type中选择c/c++ Static Library;选中Generate code only;

7、点击More settings,General-->Language选择C++;Interface选项中去掉所有选项;Close;

8、点击Build,进行编译;点击View report,弹出Code Generation Report对话框;

9、利用vs2008建立一个控制台应用程序,将生成的相关文件nrt.cpp、nrt.h、newtonSearchAlgorithm.cpp、newtonSearchAlgorithm.h、nrt_types.h、rtwtypes.h拷到相关目录下并添加到应用程序中;

10、分别在nrt.cpp、newtonSearchAlgorithm.cpp文件中添加#include “stdafx.h”;

11、test.cpp文件中代码为:

#include "stdafx.h"

#include "nrt.h"

 

#include <iostream>

 

using namespace std;

 

int _tmain(int argc, _TCHAR* argv[])

{

    double varargin_1 = 0, varargin_2 = 0, varargin_3 = 1e-9;

 

    cin>>varargin_1>>varargin_2;

 

    double nth_rt = 0, iterations = 0;

 

    double hstry_data[50] = {0};

 

    int hstry_sizes[1] = {0};

 

    nrt(varargin_1, varargin_2, varargin_3, &nth_rt, &iterations, hstry_data, hstry_sizes);

 

    cout<<"nth_rt = "<<nth_rt<<endl;

    cout<<"iterations = "<<iterations<<endl;

 

    cout<<"hstry_data = "<<endl;

    for (int i=0; i<50; i++)

    {

        cout<<hstry_data[i]<<endl;

    }

 

    cout<<"hstry_sizes = "<<hstry_sizes[0]<<endl;

 

    return 0;

}

 

参考:

1、录制的网上研讨会的MATLAB Coder视频

2、http://www.mathworks.cn/products/matlab-coder/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

举例说明使用MATLAB Coder从MATLAB生成C/C++代码步骤 的相关文章

  • 在 JavaScript 函数中加载图像

    我有获取图像像素颜色的功能 function getImage imgsrc var img img src imgsrc var imageMap new Object img load function var canvas
  • 命令 A(~A) 在 matlab 中的真正作用是什么

    我一直在寻找找到矩阵非零最小值的最有效方法 并在论坛上找到了这个 设数据为矩阵A A A nan minNonZero min A 这是非常短且高效的 至少在代码行数方面 但我不明白当我们这样做时会发生什么 我找不到任何关于此的文档 因为它
  • Matlab的导入函数的范围是什么?

    我正在尝试将一些用 Matlab 编写的代码转换为独立的 编译的 Matlab 应用程序 然而 在出现一些奇怪的错误之后 我意识到代码大量使用了从路径中添加和删除的操作 以避免多次使用多个具有相同名称 但结果 计算不同 的函数这一事实 环顾
  • JavaScript 测验在提出所有问题之前结束

    我现在正在学习 JavaScript 并且正在创建一个测验 我的测验运行正常 控制台中没有任何错误 但它会跳过问题 有时会在回答所有问题之前结束测验 即使给出正确答案 也会减少时间 我不太确定为什么它会这样做 因为在我看来它的编码是正确的
  • matlab中更快的插值方法

    我正在使用 interp1 来插值一些数据 temp 4 30 4 rand 365 10 depth 1 10 dz 0 5 define new depth interval bthD min depth dz max depth ne
  • 如何将Scheme中的函数应用于另一个函数返回的参数列表?

    假设有两个函数 f 和 v 进一步假设 v 返回长度为 n 的列表 并且 f 需要恰好 n 个参数 我正在Scheme中寻找正确的语法 以将f应用于v返回的列表 如果我使用语法 f v v arguments 然后我收到一个关于 f 需要
  • Delphi - 如果没有创建类,为什么这个函数可以工作?

    考虑这个类 unit Unit2 interface type TTeste class private texto string public function soma a b integer string end implementa
  • SQL - 需要查找重复记录但排除反向事务

    我有一张交易表 偶尔会有 重复条目 如果 当管理员发现这些重复条目时 他们将撤销交易 从而创建负值 但由于监管要求 原始重复条目仍然保留 我想创建一个 SQL 查询 并使用 Crystal Reports 来制作报告 以便管理员轻松查找重复
  • 检查对以下内容的理解:“变量”与“变量” “价值”、“功能”与“抽象”

    这个问题是后续问题this one https stackoverflow com questions 25327705 is function a sort of variable 25329157 25329157在学习 Haskell
  • 如何将数据传递给 MATLAB oncleanup 函数?

    我有一个编译好的 matlab 程序 可以自动调整机器参数 在调整周期结束时 我需要恢复一些原始设置 有时会发生意外错误 有时用户会发现调整算法未正常工作 因此应终止 使用 control C 如果发生可预测的错误 我可以使用 try ca
  • XSL字符串多重替换功能

    如何让这个函数进行多重替换 经验 替换aaa with 111并替换bbb with 222 etc
  • 将 kinect RGB 和深度值转换为 XYZ 坐标

    我正在寻找一种简单的方法将 kinect RGB 和深度值转换为 XYZ 坐标 使用 MATLAB 我的目标是一个输入为以下内容的函数 每个点的 RGB 和深度值Kinect相机 并输出 每个点的 x y 和 z 值 RGB 深度 RGB
  • 在 R 中提取 data.frames 列表的名称以及 data.frame 中的值

    在下面的代码中 j是 data frames 的命名列表 我想知道是否有办法 a 提取变量的数值 即one short and one long 在 data frames 内并附加它们的相关名称 即 AAA or BBB or CCC 到
  • 图像梯度角计算

    我实际上是按照论文的说明进行操作的 输入应该是二进制 边缘 图像 输出应该是一个新图像 并根据论文中的说明进行了修改 我对指令的理解是 获取边缘图像的梯度图像并对其进行修改 并使用修改后的梯度创建一个新图像 因此 在 MATLAB Open
  • Deploytool for MATLAB R2013b 不起作用,发生了什么变化?

    多年来我一直在使用集成deploytool为我的同事创建易于分发的 exe 文件 我几天前安装了R2013b 但无法使用deploytool不再了 尝试打包时的日志文件给出了以下内容 ant
  • 如何在 RDLC 报告上添加每个组的行号?

    我如何添加这样的行号 GROUP 1 行号 ID 姓名 年龄 1 231 test 43 2 324 test2 45 3 354 test3 34 GROUP 2 行号 ID 姓名 年龄 1 657 test4 43 2 534 test
  • MATLAB 变量传递和惰性赋值

    我知道在 Matlab 中 当将新变量分配给现有变量时 会进行 惰性 评估 例如 array1 ones 1 1e8 array2 array1 的价值array1不会被复制到array2除非元素array2被修改 由此我推测Matlab中
  • 如何从 matlab 调用 Qtproject?

    我在 matlab 中有一个函数可以写入一个 file txt 我在 qt 项目中使用它 So 当我使用 unix 获取要运行的 qt 编译可执行文件时 我有一个 Matlab 文件 但出现错误 代码 unix home matt Desk
  • MATLAB parfor 和 C++ 类 mex 包装器(需要复制构造函数?)

    我正在尝试使用概述的方法将 C 类包装在 matlab mex 包装器中here http www mathworks com matlabcentral newsreader view thread 278243 基本上 我有一个初始化
  • 氡变换线检测

    我正在尝试检测灰度图像中的线条 为此 我在 MATLAB 中使用 Radon 变换 我的 m 文件的示例如下所示 我可以使用此代码检测多行 我还使用线条的移位和旋转属性来绘制线条 但是 我不明白在获取rho和theta值后如何获取检测线的起

随机推荐

  • 每日编程一题刷之有序数组的平方(暴力解法+双指针)

    每日编程一题刷之有序数组的平方 暴力解法 双指针 目录侠 文章目录 每日编程一题刷之有序数组的平方 暴力解法 双指针 题目链接以及描述 题解分析 双指针解法 小结 题目链接以及描述 977 有序数组的平方 力扣 LeetCode leetc
  • 快速搭建一个Web AR应用

    AR是增强现实的缩写 可以在真实世界的映像中叠加额外的信息来增强对现实的表达能力 最出名的一个AR应用就是精灵宝可梦了 玩家用手机在现实世界中捕捉宝可梦小精灵 通常AR应用可以根据不同的方式来对现实世界的映像进行处理 然后生成AR信息 例如
  • Findbugs工具的安装和使用

    今天了解到一个FindBugs工具 去百度了一下 这是一个静态分析工具 顾名思义 这个工具就是帮助我们去扫描Bug的 具体的功能就不赘述了 可以去百度 下面直接将安装的过程和使用吧 注 我刚开始的时候也是根据百度上面的提示去下载和安装Fin
  • VMWare删除虚拟机

    VMWare删除虚拟机 方法一 1 选中要删除的虚拟机操作系统 单击右键 选择 管理 选项 2 然后在选择 从磁盘中删除 选项即可删除该虚拟机操作系统 方法二 1 选中要删除的虚拟机操作系统 选择 VMware 软件最上方的 虚拟机 选项
  • SSH框架搭建的全过程(eclipse)

    SSH框架是最常用的框架之一 在搭建SSH框架的时候总有人遇到这样 那样的问题 下面我介绍一下SSH框架搭建的全过程 第一步 准备工作 下载好eclipse Struts2 Spring Hibernate 1 eclipse eclips
  • C语言-数组

    目录 一 一维数组 1 1 数组的创建 1 2 数组的初始化 1 3 一维数组的使用 1 4 一维数组在内存的存储 二 二维数组 2 1 二维数组的创建 2 2 二维数组初始化 2 3 二维数组使用 2 4 二维数组的存储 三 数组越界 四
  • 任意文件查看与下载漏洞

    任意文件查看与下载漏洞 一些网站的业务需求 可能提供文件查看或下载功能 如果对用户查看或下载的文件不做限制 就能够查看或下载任意的文件 可以是源代码文件 敏感文件等等 形成漏洞的原因 存在读取文件的函数 读取文件的路径用户可控且未校验或校验
  • 羊、狼、农夫过河

    题目来自 33条消息 羊 狼 农夫过河 华为OD真题 100 keven000777的博客 CSDN博客 题目内容 这个题目比较重要的地方就是农夫回程时不能携带动物 因此问题就稍微简单了一些 我拜读了这位老哥的文章 并在他的代码基础上修改了
  • React总结7:render()渲染时机

    根据官网表示 JSX是属于一种不可变的对象 即只要一创建就不能被改变 继续我们c Java中的字符串一样 是属于常量范围 不容许改变 不能改变属性啊 孩子节点也不可以改变 这个元素就像电影中的某一帧 是处于一个确定的时间点上 不管你放多少遍
  • 互联网产品经理在线原型设计工具Cacoo(草稿)

    费注册地址 https cacoo com 注册后即可使用 用户交流地址 http www masterchat cn bbs thread 85 1 1 html Cacoo 草稿 简介 实时交互地在线制作图表 Cacoo是在线制作 发布
  • 剑指 Offer 14- I—剪绳子

    题目描述 给你一根长度为 n 的绳子 请把绳子剪成整数长度的 m 段 m n都是整数 n gt 1并且m gt 1 每段绳子的长度记为 k 0 k 1 k m 1 请问 k 0 k 1 k m 1 可能的最大乘积是多少 例如 当绳子的长度是
  • 滚动条的使用

    滚动条需要父盒子有固定的高度宽度 而且父盒子内的内容超过固定的高度宽度并使用overflow auto 就能在相应的位置出现滚动条
  • 波场通过TRON-WEB转账加备注实现

    向转账交易信息中追加 备注信息 await tronWeb transactionBuilder addUpdateData res transaction 备注信息 utf8 对已经添加备注的交易信息进行签名 let sign await
  • phpmyadmin 4.8 版本无法登陆问题

    如图 这个问题困扰题主好久了 今天晚上终于搞定 进入mysql 输入 status 得到以下信息 把 var lib mysql mysql sock 记下来 到phpmyadmin目录下的libraries 编辑config defaul
  • Visio高级使用技巧(未完待续)

    简介 Microsoft Visio是Microsoft Office的组件之一 Office三件套 Word Excel PowerPoint 的铁粉可不能错过它 Visio是一款流程图制作工具和图表绘制软件 具有与Office三件套相似
  • 虚拟机重启网卡失败记录修改方法

    1 使用systemctl status network service命令查看错误详情 2 出现这种报错一般是和 NetworkManager 服务冲突导致的 直接关闭 NetworkManger 服务就好了 关闭NetworkManag
  • 达摩院发布2021十大科技趋势(附PDF版)

    关注ITValue 看企业级最新鲜 最价值报道 刚刚 阿里巴巴达摩院发布2021十大科技趋势 这是达摩院成立三年以来第三次发布年度科技趋势 2020年是不平凡的一年 经历疫情的洗礼 许多行业重启向上而生的螺旋 但疫情并未阻挡科技前进的脚步
  • ELK的优点和局限性

    ELK作为一种开源的日志管理解决方案 具有以下优点 实时性高 ELK可以实现实时索引和搜索 支持高效的日志收集和处理 可以帮助用户及时发现问题和异常 提高系统的响应速度和稳定性 可扩展性强 ELK的架构支持水平扩展和负载均衡 可以根据需要增
  • 为什么打两拍可以消除亚稳态的影响?

    为什么打两拍可以消除亚稳态的影响 首先 我们需要了解什么是亚稳态 看下图 简单来说 就是当时钟信号上升沿到来的时候正好采样的数据也在发生变化 但是对于采样的时钟信号 如果想要采样得到一个稳定值 在clk的上升沿的前一段时间有一个建立时间TS
  • 举例说明使用MATLAB Coder从MATLAB生成C/C++代码步骤

    MATLAB Coder可以从MATLAB代码生成独立的 可读性强 可移植的C C 代码 使用MATLAB Coder产生代码的3个步骤 准备用于产生代码的MATLAB算法 检查MATLAB代码的兼容性 有些matlab代码语句并不能生成c