分享

java调用matlab中神经网络工具箱编程

 尉迟容若 2011-05-11
java调用matlab中神经网络工具箱编程

关键词:java matlab 联合编程 神经网络

搜索“Java中调用matlab代码的方法 ”应该会搜索到很多,所以这里就简写一下吧~

一、安装matlab、java,配置好java环境

应为matlab生成jar时直接调用的命令行,所以配置好java的标准就是在cmd里java和javac命令都可以用了~

matlab据说低版本的也不能导出,所以就选个新点儿吧,我的是2010a

二、在matlab中编写function文件

三、运行matlab中的deployment tool,新建一个项目,选择target一定是java的哦~

四、添加类,编辑类名

五、添加刚刚的function文件

六、编译~

至此算是完成了,编译完之后再distrib文件夹下会有一个以你项目命名的jar文件,将这个文件和javabuilder.jar()添加到java程序的运行环境中就可以了,调用方法:

// 训练好的net文件,从matlab中导出的
String matStr = "C:/matlab.mat";
MWCharArray matPath = new MWCharArray(matStr);
// 要进行test的数据
double[][] xn_test = { { 71.60 }, { 0.00 }, { 107.41 }, { 110.99 }, { 0.00 } };
MWNumericArray test = new MWNumericArray(xn_test, MWClassID.DOUBLE);

// 声明打包的类,调用测试方法
Net_RBF netRBF = new Net_RBF();
Object[] result = netRBF.rbfTest(1, matPath, test);//这个1是指输出结果的数目,具体看distrib下的doc
// 输出结果
System.out.println("计算结果是:" + result[0] + "\t");

 

推荐一篇文章:这个写的详细些,就是看不太清,呵呵

http://www.docin.com/p-55963408.html

 

遇到的错误:

一、Attempt to use an MWArray that has been disposed
用错对象了,本来是要用new MWCharArray(str);,结果用成了new MWNumericArray(str, MWClassID.CHAR)

二、undefined function or method 'newrb' for input arguments of type 'double”

先说一堆解释:

在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的目录,然后开始编译。(此部分测试失败,暂时用的方法就是前面说的)

所以解决方法就是在matlab下训练好网络,将net保存为mat文件,然后再写一个m文件,load进mat文件,sim~ok~

代码:

A=load(‘bpnet.mat’);
B = fieldnames(A);
net=A.(B{1});
xn_test = [71.60  0.00   107.41 110.99  0.00 ]';
net=network(net);
Y=sim(net,xn_test); 

三、load加载时network类型自动转换struct

这个不是我碰到的,但也是提前看到别人的问题才避免的,解决办法就是上面的代码中,在sim前加上net=network(net);这句话~

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多