zoukankan      html  css  js  c++  java
  • Matlab转c与c++代码

    原文转载: https://blog.csdn.net/android_lover2014/article/details/80450760

    作为一个强大的科学计算软件,matlab广泛运用于较多领域,以其简单的编程风格,便利的调试环境等等众多优点,在编写算法与测试的时候通常用到。然而很多的实际运用上matlab毕竟还不是很普及,相反还是c与c++更多。同时正版matlab这样一个昂贵的软件大家都懂得。有的时候我们在使用到国外许多人开发的matlab版的算法工具箱的时候想把它变成c与c++版本的很困难,那么所以如何将matlab程序编程c程序就很重要了。Mathworks公司似乎考虑了这点,早早集成了matlab转c的代码生成模块:matlab coder。本节简单一窥其运用。
    Ok截至目前最新版的matlab是2015b,怎么安装上就不说了。这里介绍的是在matlab2015b下的使用。为什么选择2015b,肯定越新的版本支持的越多,要知道matlab并不是能把其自带的所有内部函数都转化为c代码的,也不是所有的matlab数据类型都可以转化的,比如2015b之前的版本,如果你的matlab代码中存在cell结构的数据时你是转换不成c代码的,不支持,2015b也才刚刚支持,所以如果碰到cell结构的数据,在以前的版本你还得去转换成其他格式,cell数据类型的数还挺麻烦,不好弄。新本还有一些其他新加功能,详细去看官网吧。怎么使用matlab coder官网也有些介绍:
    http://cn.mathworks.com/products/matlab-coder/webinars.html

    下面介绍简单实例,求取两个4*4矩阵相加后,在求取最大值与最小值。这里先用一个函数实现,在分成两个函数实现,因为有的时候函数里面再调用函数的时候该怎么办。
    一个函数的话如下:

    function [a,b] = min_max(m,n)
    temp = m+n;
    a = max(max(temp));
    b = min(min(temp));
    1
    2
    3
    4
    对了,matlab代码生成只能生成函数,对于脚本是无法生成c代码的(像上面这个带function的叫函数,没有function的m文件是脚本)。好了可以打开matlab coder了。

    选择刚刚的那个函数,下一步

    由于这里只有一个函数,也不用调用其他的函数(当然matlab内部自带的函数不用管了,想min与max),所以也不用添加其他函数。下一步


    这一步是指定输入数据类型的,比如说你的两个相加矩阵是多大的呀,是int还是double等等。这里有两种方式,一种是根据函数的使用实例自动确定输入类型,一种是自己手工确定输入矩阵大小等等。那么一般的话,如果你知道你的矩阵大小,或者简单的函数,用第二种完全可以,但是有些时候,比如说我们的输入是一个大结构体,结构体里面超复杂,你怎么去一个个确定里面的什么输入(这种情况常见于我们使用别人的工具箱的函数的时候)。这个时候第一种第一种很好了,那么第一种方式什么意思呢?就是让你自己建立一个脚本(不是函数),然后脚本你们包含了你的这个函数的用法。这里假设我的两个矩阵为4*4的矩阵,好了再建立一个实例化的test脚本如下:

    M1 = rand(4,4);
    M2 = rand(4,4);
    [a,b] = min_max(M1,M2);
    1
    2
    3
    然后按照方式一选择这个test.m脚本:
    点击自动确定输入类型,点完后就会出现自动确认的输入类型了。下一步


    这是检验一下测试的脚本行不行,如果你上述不是自动确认输入方式的话可能没有这一步,然后下一步


    到这里才是真正产生c与c++代码的时候了,当然还有些默认参数可以修改,正常你就不要改了。直接选个c或者c++,产生吧。完了以后会看到


    有一堆,但是也有几个主要的(用到c++中不知道选哪个就都选上吧),这么个简单的matlab函数转换成c++有160多行,算了,反正也不是自己写,管他多少行。在下一步打包就完成了。

    Ok转换完的c++怎么在vs(我的是vs2010)上使用呢?

    打开vs,新建c++工程,等等等等,最后把这个生成的一大堆复制粘贴放到vs所在的那个文件夹下的那个工程中去,在vs中的源文件下添加现有项目,把刚才复制的cpp都添加进去,h文件添加到头文件(要复制粘贴,然后在添加已有项),也可以把matlab生成的example文件夹里的main的cpp与h添加进去,最后添加完的如下:


    这个时候直接运行main是可以运行的,不过结果什么也没有,因为main函数里面随机生成4*4的矩阵是这样的,

    全是0,且在c++这里,你也没有让它显示cout出来
    Ok,把这个main函数改一下,生成随机数也改一下,生成1-10随机数

    显示出来,注意加点头文件。现在再去运行结果如下:

    前面是两个矩阵(拍成一列了),对应相加再去求最大最小,发现是对的吧。Ok结束。

    下面把这个矩阵求和然后在求最大最小分成两个m函数,如下:

    function mn = addadd(m,n)
    mn = m+n;

    function [a,b] = min_max(m,n)
    temp = addadd(m,n);
    a = max(max(temp));
    b = min(min(temp));
    1
    2
    3
    4
    5
    6
    7
    这样再去生成c++代码:

    在添加函数这一块,可以把用到的都添加进去,也可以只添加最终的那个,像这里就是min_max是最终的,他会调用addadd,所以addadd加不加都可以,matlab在下一步会自动添加的。接下来类似,那么来看看识别出来的输入对象:

    生成的代码如下,可以看到这个时候不再是一个min_max.cpp,还多了个addadd.cpp,并且在min_max函数中调用了如下:

    后面的过程你也知道了吧,同上,好了转换的过程以及如何使用就到这里吧。


    ————————————————
    版权声明:本文为CSDN博主「on2way」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/on2way/article/details/49204511

  • 相关阅读:
    Eclipse 远程调试
    大数据处理方法bloom filter
    sicily 1259 Sum of Consecutive Primes
    sicily 1240. Faulty Odometer
    sicily 1152 简单马周游 深度优先搜索及回溯算法
    sicily 1050 深度优先搜索解题
    sicily 1024 邻接矩阵与深度优先搜索解题
    sicily 1156 二叉树的遍历 前序遍历,递归,集合操作
    sicily 1443 队列基本操作
    sicily 1006 team rankings 枚举解题
  • 原文地址:https://www.cnblogs.com/MCSFX/p/15307373.html
Copyright © 2011-2022 走看看