最近想用C#调用matlab编译成的关于rbf神经网络的dll文件,出现了很多问题。
先将问题列入下面:
1 rbf神经网络分为设计网络newrbe 和 预测sim 两部分,但sim是matlab的内置的函数,你根本看不到代码,不信你在命令行里输入edit sim 的话,会提示:built-in function,根本看不到庐山真面目,这样的话就不能将sim直接作为一个函数进行编译。
2 调用newrbe后回返回一个生成的网络net,这里包含了所有的网络参数,作为后面sim的一个输入参数,所以如果以后需要用训练好的模型预测是,就必须提供该参数,所以希望能将这个参数在.net环境里保存下来,但在 .net 里传出来的是空,也就是说根本返回不了任何值,这样如何保存??5555
现在就这两个问题进行一下探讨,对于问题1,我采用了在matlab下再封装一个函数Sim,其中在该函数里调用系统的内置函数sim,这样就有了具体的函数,就可以进行编译了,具体代码如下:
function result = Sim(net,p)
result = sim(net,p');
result = result';
当然我传入是用的p的转置,是根据我的矩阵的格式需要,可根据自己的矩阵格式进行调整。
当然,为了比较对应,我也将newrbe进行了一下封装成Train函数,这样的话在生成的.dll中只需要调用Train和Sim 就可以完成训练和预测。
function net = Train(p,t,spread)
net = newrbe(p',t',spread);
对于问题2,我比较头疼,因为明明是在matlab里有返回结果,但是传到.net 平台下就是空的,我无奈啊,尝试了很多方法,都是徒劳,正当我又要绝望的时候,我突然想到了返回的net的数据类型,我试探了一下,发现返回的类型是matlab里自定义的一个network类型,这真是怪,我还以为是struct,或者cell等类型,原来是这个卑鄙的类型弄的我好郁闷,于是我试着将network转换成struct的类型,然后再试试,我靠,my god ,竟然返回了值,当时欣喜若狂的心情不亚于找到了女朋友的兴奋。
下面是改写后的Train和Sim
function net = Train(p,t,spread)
net = newrbe(p',t',spread);
net = struct(net); //添加了该行代码,强制转换,其他类型之间的相互转换能否成功就看你的运气了,看来我运气不错,汗!!
function result = Sim(net,p)
net = network(net); //对应添加该行代码
result = sim(net,p');
result = result';
做到这里本来以为可以喝杯茶了,没想到困难又接踵而至&#x