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

2024-02-07 06:32

本文主要是介绍举例说明使用MATLAB Coder从MATLAB生成C/C++代码步骤,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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;

}

这篇关于举例说明使用MATLAB Coder从MATLAB生成C/C++代码步骤的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/686814

相关文章

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

在Java中使用OpenCV实践

《在Java中使用OpenCV实践》用户分享了在Java项目中集成OpenCV4.10.0的实践经验,涵盖库简介、Windows安装、依赖配置及灰度图测试,强调其在图像处理领域的多功能性,并计划后续探... 目录前言一 、OpenCV1.简介2.下载与安装3.目录说明二、在Java项目中使用三 、测试1.测

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

mybatis中resultMap的association及collectio的使用详解

《mybatis中resultMap的association及collectio的使用详解》MyBatis的resultMap定义数据库结果到Java对象的映射规则,包含id、type等属性,子元素需... 目录1.reusltmap的说明2.association的使用3.collection的使用4.总

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

mybatis-plus QueryWrapper中or,and的使用及说明

《mybatis-plusQueryWrapper中or,and的使用及说明》使用MyBatisPlusQueryWrapper时,因同时添加角色权限固定条件和多字段模糊查询导致数据异常展示,排查发... 目录QueryWrapper中or,and使用列表中还要同时模糊查询多个字段经过排查这就导致只要whe