Vc++6.0调用matlab的数学库函数
前段时间在摸索如何在VC++6.0当中调用Matlab的里的数学库函数。
当时弄得我很是郁闷,现在想想,自已走了很多弯路,原来,是如些的简单。
所以,与出来和大家一起讨论和分享。
一、关于Matlab6.x
首先,matlab它本身也是用C++语言编写的,具是什么是编译器我倒是忘记了(好像是Borland吧)。
说Matlab是一种科学计算语言吧,其实也可以,不过,其实也可以把它看作是一个科学计算软件。
它里面有很多的已写好的数值计算、分析以及统计等的函数。
然后在Matlab里写文件(比如.m文件),文件里的每一个语句其实都是在调用它里面的函数。
说白了,Matlab就是为我们写了一大堆的数学运算函数,然后再能过文档(help指令)来告诉我们怎么调用这些函数,就是这样。
其次,为什么要选择Matlab的6.x版?现在最新的版本好像是7.x了吧,照理说,就应该用最新版的。
可是,最新版的Matlab(7.x)不再把数学库公共了,如果想要调用它里面的函数库,就必须将Matlab在后台运行。
也就是说,不管你用什么语言,只要你想调用Matlab7.x里面的函数,那么你的程序就必须在Matlab运行环境下运行。
哦,刚才忘记说了,这篇日志的目的是要建立独立于Matlab 运行环境的程序。
最后,Matlab6.x已推出七八年了,会不会和7.x版本相比而有点过时了?我是这样理解的,如果你调用的函数不是一些当前数值计算领域的新兴问题,那就是没有问题的。
对于我们工科的人来说,10年前的伟大的mathworks公司绝对可以提供我们想要的计算方法了。
所以,6.x,没问题。
二、关于C++和Matlab混合编程
关于这个主题的文章是非常之多的,足以让你眼花缭乱了。
更让我感到不解的是,有好多人居中然以C++和Matlab混合编程为主题,在正式期刊上发表文章。
不信你可以在知网或万方上搜搜看,呵呵,一大把。
不过,我还是要感谢这些文章啊,因为这些文章让我理解了什么是“灌水”。
所谓的C++和Matlab混合编程大概是指这样的一个过程:
1)在Matlab里写.m文件,当然,这种文件中除了函数好像就没有别的什么了。
2)在Matlab里的命令行中使用mcc命令生成C/C++代码。
当然,还可以直接生成.dll和.lib,这里的.dll和.lib都是C的,不能生成C++的动态链接库(反正文档里是这么说的)。
3)在C/C++编译器中嵌入生成的C/C++源码,或调用生成的.dll。
我说,何必这么麻烦呢?
三、弯路子
如果要按照上面所述的三个步骤来进行C++和Matlab混合编程的话,那就必须要安装Matlab了(要不然怎么编写.m文件和使用mcc命令)。
在安装Matlab的时候,注意,最好是安装在和你的C/C++编译器所在安装目录的同一个目录下,这一点很重要,要不然,你会发现mcc命令不好使。
安装好之后,你就可以按以上的三个步骤来编程了,具体的一些细节,相关的文章实在是太多了,这里就不多说了。
因为,我觉得这是一种弯路方法。
四、言归正传
拜完了“前辈们”,终于轮到我说话了。
其实,不用安装Matlab,不用.m文件。
其实,说到底,Matlab就是为我们写了许多数学计算函数(可以调用的大约在400多个),然后把这些函数放在一个个的动态链接库中。
是的,就是这样理解的,不用想得太多了。
那么既然是这样,我们直接调用这些库不就成了嘛,是的,就是这样的,就是这么简单。
首先,我们需了解matlab的安装目录里都有些什么东西,当然,在这里,我们就只关心它的数学库在什么地方。
是这样的,只用关心两个文件夹:<matlab>/bin和<matlab>/extern(<matlab>指的是matlab的安装目录),是吧,找到了吧,bin这个文件夹,看到这个
名字就知道它是里面一定是一些.dll,果然是这样的,matlab里面的所有c/c++数学库都在这个文件夹里面的。
别外,要想引用这
些.dll,你当然需要相应的.h/.hpp头文件和.lib文件了,那么,在<matlab>/extern/include里面就是头文件,而在
<matlab>/extern/lib就是.lib文件(静态链接库)了。
我们所需要的东西就是这么多了,别的,真的不需要了。
所以,我说,不需要安装matlab了,你直接在一台装有matlab的机器上把这两个文件夹(<matlab>/bin和<matlab>/extern)拷到你的电脑来就行了。
两个matlab的两个官文档是很有用的:MATLAB C++ Math Library User’s Guide 和MATLAB C++ Math Library Reference具体是这两个文档,顾名思义,就不用我说了,如果你发现在网上找这两个文档有困难的话,我的机器上倒是有。
五、总结
虽然,一二三四五这么一串说下来是说了很多没有用的话,不过对于新手来说,应该是有一定帮助的,真的可以节省很多宝贵的时间。
唉,其实真是还有一些比较重的细节的东西没有写出来,比如
c++编译器环境的配制,mwArray和mxArray的困惑,c++函数的调用格式与matlab里调用的异同等,不过,对于新手来说,上面的这些东西已经够烦的了,呵呵。
下午就要回家了,回家过年,就到这里吧。