作为一个强大的科学计算软件,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));
对了,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);
然后按照方式一选择这个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));
这样再去生成c++代码:
在添加函数这一块,可以把用到的都添加进去,也可以只添加最终的那个,像这里就是min_max是最终的,他会调用addadd,所以addadd加不加都可以,matlab在下一步会自动添加的。接下来类似,那么来看看识别出来的输入对象:
生成的代码如下,可以看到这个时候不再是一个min_max.cpp,还多了个addadd.cpp,并且在min_max函数中调用了如下:
后面的过程你也知道了吧,同上,好了转换的过程以及如何使用就到这里吧。