Matlab builder for .net (deploytool)使用心得2

本文介绍了在C#中调用Matlab编译的RBF神经网络DLL时遇到的问题及解决方法。主要问题包括:1) MATLAB内置函数sim无法直接编译;2) 网络参数无法在.NET环境中正确返回。解决方案是通过在MATLAB中封装函数,并将网络参数转换为struct类型,从而成功返回和保存。此外,文章还详细讲述了网络结构的序列化和反序列化过程中遇到的函数句柄问题及其解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近想用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';

 

做到这里本来以为可以喝杯茶了,没想到困难又接踵而至, 比上两个更加其实凶凶,我也能力有限,拜托饶老衲一回吧,但它没有,经过是这样的,我想用.net 的序列化和反序列化将返回的网络序列化后保存起来,等于测试再取出用做Sim的一个输入参数,想法其实很简单,有两种序列化方法:二进制和XML,但情况并非我所愿啊,我采用的二进制序列化,在反序列化时竟然抛出”调用的目标发生了异常“,我晕,难道天妒英才,要绝我门路??这是我的序列化反序列化代码:

 //序列化参数
        public string SerializeObjec2DB(AlgoParametersBase AlgoParameter)
        {
            IFormatter formatter = new BinaryFormatter();
            string result = string.Empty;
            using (MemoryStream ms = new MemoryStream())
            {
                formatter.Serialize(ms, AlgoParameter);
               
                byte[] algoBytes = new byte[ms.Length];
                algoBytes = ms.ToArray();
                result = Convert.ToBase64String(algoB

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值