在使用matlab工具进行神经网络算法开发时,在matlab下可以正常使用。但是在编译生成jar包供java程序调用时,提示如下错误:
错误使用 feval
未定义与 'struct' 类型的输入参数相对应的函数 'nn_net_input_fcn.info'。
出错 nnModuleInfo (line 11)
出错 nnet7.net_input_fcn (line 6)
出错 netsum (line 28)
出错 network/subsasgn>getDefaultParam (line 2045)
出错 network/subsasgn>newLayer (line 2295)
出错 network/subsasgn>network_subsasgn (line 18)
出错 network/subsasgn (line 10)
出错 network>setnet (line 178)
出错 network>new_network (line 168)
出错 network (line 71)
出错 newff>new_5p1 (line 176)
出错 newff>create_network (line 129)
出错 newff (line 101)
出错 BPTest12 (line 6)
从matlab官网解释,初步理解为Matlab Compiler不允许神经网络工具包训练函数被编译。(https://cn.mathworks.com/products/compiler/supported/compiler_support.html)。
针对上述问题,结合网上查找问题解决办法总结,总体思路流程如下:
1,用matlab神经网络工具编写相应神经网络创建、训练、测试过程(此处省略);
2,将训练好的神经网络模型,保存.mat文件。save([‘路径’,’文件名’],’对象名’)。示例如下:
save(['c:/','net.mat'],'savenet');
执行完之后,将会在path路径下找到一个net.mat文件。此时,训练好的神经网络模型就保存为.mat文件,供后续调用。
3,matlab工具编写调用在第2步训练模型.mat文件所在的路径,load(‘路径/net.mat’)
net=load(‘路径/net.mat’);
[an,tr]=sim(net.savenet, 输入预测矩阵);
function [ output ] = BP_Class( input,input_forecast )
net=load(input);
inputn_test=mapminmax(input_forecast');
[output ,tr]=sim(net,inputn_test);
end
%在这里需要注意一点,如果是用[an,tr]=sim(net,输入预测矩阵);会出现如下错误:
%'model' parameter must be a string,这是由于该训练网络模型被保存为 struct array。必须用此格式进行引用 importvariablename.savedvariablename
%https://cn.mathworks.com/matlabcentral/answers/46034-neural-network-error-model-parameter-must-be-a-string-when-calling-sim-net-data
4,java中调用matlab的函数传递参数为矩阵。
在java程序中,定义一个多维数组,再通过构造函数MWNumericArray(double rval, MWClassID classid)。
//创建一个2*4矩阵
int num[][]={{1,2,3,4},{5,6,7,8}};
MWNumericArray ayNum = new WNumericArray(num,MWClassID.SINGLE);
TestClass testClass=newTestClass();
result2=testClass.BP_Class(1,"c:\\net.mat",ayNum);