如何调用matlab的神经网络工具箱,如何从VC中调用MATLAB的神经网络工具箱

为了实现从VC调用MATLAB的神经网络工具箱,最近这两天可谓是折腾了好一阵子。好在最终总算是把它给搞定了,不妨在此做个小结,希望对遇到同样问题的同学能起到一定的借鉴作用。

我所采用的方法是利用matlab中的deploytool命令将写好的m函数(该函数的主要功能是使用神经网络工具箱来实现一个简单机器学习算法)编译成C++的动态链接库,然后再VC中调用。虽然原理说起来简单,可做起来却颇不顺利,先后遇到了一系列问题:

一、无法识别编译器

我最初使用的软件版本是matlab

R2009a及vc2008,首先遇到的第一个问题是在matlab中使用mbuild -setup命令对matlab

compile进行配置时,出现了如下结果:

Please choose your compiler for building

standalone MATLAB applications:

Would you like mbuild to locate installed

compilers [y]/n? y

[1] Lcc-win32 C 2.4.1 in

D:\PROGRA~1\matlab\r2008b\sys\lcc

[0] None

简单来说就是无法识别已安装的VC2008的编译器。后来通过在Matlab中文论坛中查阅相关资料,用如下方法解决了该问题:

>> mbuild

-setup

Please choose your compiler for building standalone MATLAB

applications:

Would you like mbuild to locate installed compilers

[y]/n? n

Select a compiler:

[1] Lcc-win32 C 2.4.1

[2] Microsoft Visual C++ 6.0

[3] Microsoft Visual C++ .NET 2003

[4] Microsoft Visual C++ 2005 SP1

[5] Microsoft Visual C++ 2008 Express

[6] Microsoft Visual C++ 2008 SP1

[0] None

Compiler: 6

The default location for Microsoft Visual C++ 2008 SP1 compilers is

C:\Program Files\Microsoft Visual Studio 9.0,

but that directory does not exist on this

machine. Use C:\Program Files\Microsoft Visual Studio 9.0 anyway [y]/n?

n

Please enter the location of your compiler:

[C:\Program Files\Microsoft Visual Studio 9.0] D:\Program

Files\Microsoft Visual Studio 9.0 Please verify your choices:

Compiler: Microsoft Visual C++ 2008

SP1 Location: D:\Program Files\Microsoft Visual Studio 9.0

Are these correct [y]/n? y

按照别人的说法,出现这一问题的原因有两个:一是先安装MATLAB再安装Visual Studio;二是Visual

Studio没有安装在默认路径。不过我后来的实验证明,即使我先在默认路径安装VC2008,再安装MATLAB

R2007b,在MATLAB中仍然无法识别出VC的编译器,此乃后话。

二、运行时错误

按照网上的教程,我利用deploytool编译出了m函数相对应的三个文件:*.lib,*.h及*.dll,将其加入到新建立的C++工程(Win32

Console)中,并在项目属性及IDE的选项中做好相关配置。但运行到MCR的初始化函数部分mclInitializeApplication(NULL,0),就出现了RunTime

Error的错误。

由于是在Matlab Component

Runtime上出现的问题,我只好尝试着安装MCR环境,即运行\toolbox\compiler\deploy\win32里的MCRInstaller.exe文件。安装以后再次运行程序,这时候mclInitializeApplication(NULL,0)函数及接下来的dll库初始化函数均可以正常运行,但在函数调用的时候又一次出现了RunTime

Error的错误:“R6034, an application has made an attempt to load the C

runtime library

incorrectly.”此时还不能够关闭错误警告窗,整个VC处于假死状态,得从任务管理器中强行终止。

难道是因为编译的m文件比较复杂,调用到了一些有图形界面显示的函数?为此,我重新做了一个测试,该测试中所调用到的m函数只是实现了矩阵相加的功能。运行之后发现仍然会出现RunTime

Error的错误警告窗,只不过此时该警告窗口能够被关闭,而程序还是可以得到正确的结果。

网上搜寻无解,我继续尝试着将已有的VC2008和MATLAB R2009a卸载,重新将VC2008安装在默认的路径C:\Program

Files\Microsoft Visual Studio

9.0,安装MATLAB的较低级版本R2008b,并且将之前安装的7.10版本的MCR环境卸载掉,因为R2008b自带了7.

09版本的MCR。

作了以上工作后,重新运行C++程序,那恼人的RunTime

Error总算不再出现了。将调用的m函数变得复杂些,加入了作图的plot命令,一切仍然正常。摸索到现在,总算是看到了一点曙光。

三、无法调用神经网络工具箱中的相关命令

现在开始编译我们最初的m代码,在C++中调用生成的dll,出现“undefined function or method

'newrb' for input arguments of type

'double”的错误信息。返回去查看m代码编译时产生的日志文件mccExcludedFiles.log,发现其中有这么一句:

D:\Program

Files\MATLAB\R2008b\toolbox\nnet\nnet\nnnetwork\newrb.m

called by

F:\HybridProgramming\MLA\depth_mapping.m

(because of toolbox compilability rules)

看起来像是matlab compile不支持对newrb命令的编译。

为了证实这一点,我查找了MATLAB的官方论坛,管理员对一个遇到同样问题的人回答如下:

You will not be able to compile any function which trains the

network (like ADAPT). Though the link does not explicitly list

these funcions (like ADAPT), they fall under the 'All other command

line functionality'.

However, you can deploy a M function code which uses a

pre-trained network. I believe the SIM function will deploy

fine.

The workflow I see is:

1. In MATLAB, train you network using test input/output

2. Save the network (mat file?)

3. Create a deployable function which then uses the pretrained

network for new data. The network itself would not

change/adapt/train in this function

4. Compile and deploy the above function

总之其主要意思就是说,MATLAB

compile不支持对神经网络工具箱中涉及到训练的函数命令进行编译(像我所使用的newrb命令正是如此),只能编译那些用在已训练好的网络上的函数命令(例如SIM)

这样看来,难道我只能使用MATLAB引擎法来调用神经网络的相关命令,都已经进行到现在,实在不甘心。抱着试一试的心态,我在MATLAB中使用deploytool命令新建一个C++

Shared

Library的编译工程,并从MATLAB目录里将newrb.m文件拷贝了一份到当前的编译工程目录下,除了将我们希望调用的depth_mapping.m添加进编译工程的Exported

functions目录,拷贝过来的newrb.m也被添加到Other files的目录,然后开始编译。

最终,由这两个m文件所编译成的dll文件,居然在C++中调用成功。看到C++运行时弹出来的训练误差曲线图,觉得这两天总算没有白折腾。当然,有可能我的方法完全就是贻笑大方,在这里就权且算是抛砖引玉吧。

需要一提的是,同样的配置,同样的MATLAB和VC版本,这种混合编程的方法在我vista的笔记本上却不能运行成功,连调试模式都无法进入,显示STATUS_DLL_NOT_FOUND的错误,可MATLAB生成的dll文件明明都已经放在了运行程序的目录中了呀。究竟这是什么问题?还希望能有这方面的编程高手多多指教。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值