matlab&c++混合编程

昨天刚刚编写完混合编程的初级教程,下午就发现了程序出现了bug,bug的来源尚不清晰,现在先简单的记录以下所遇到的问题。
最开始,当进行了几次的尝试译码后,发现译码正常,便觉得程序已经调好了,在一次性训练30个数据包时,发现matlab报错后直接崩溃,一开始是认为内存溢出,于是网上查找相关问答,有博主说是cpp文件在每个子函数运行完后,会把局部变量清除,可是malloc所申请到的变量需要使用free手动清除,prhs,plhs只能由c自动清除,并且,free后的指针变量需要指向NULL。
检查cpp程序的以上错误,发现并没有犯,可是30个包的训练一直是一个门槛,可以将该程序连续跑3个10次,却不能跑30次(30生死线),并且,有时候文件会无缘无故的崩溃,例如一句一句跑可以,直接全部一起跑就不行。
在将程序多运行几遍后,程序慢慢稳定下来,发现问题主要出现在第29和数据包的第8次尝试译码,第1-28个包的信道状态良好,没有进行八次的重复译码,于是将程序进行简化,只使用第八个译码矩阵,配合mexprin程序,发现无法译码,具体的错误类型和mydata_1500博文中写的类似,哪怕是直接传入无衰落,无噪声的信号,依旧不能译码,于是使用genHH文件和其他的相关文件,对第八个矩阵重新进行生成(包括A,B,P,rearr),再次尝试译码,发现译码成功,可是第七个校验矩阵出现了相同的问题,以此类推,将所有的校验矩阵重新生成后再次运行程序,程序运行成功。并单独对所有的校验矩阵进行了测试,发现矩阵运行正常。
首先记录几点事项
1.在mex程序debug的时候,多跑几遍源程序,哪怕matlab直接崩溃了,也需要选择继续尝试,观察译码失败处的数据的结构的问题,之前是看到30次包无法连续传输就怀疑时电脑的内存爆掉了,可是在rayleigh信道中i+15,把时序往前推进了15个单位后,发现在第14个包的第8次译码时出现了问题,输入数据都是随机的,不存在输入信号的结构存在问题,于是问题就出现在瑞利信道(即29这个点)或检验矩阵(即8这个点存在了问题)大概看了看瑞利信道因为使用llr.m译码时没有出现NAN的问题,所以就猜测是校验矩阵的问题,按照常理来说,校验矩阵也是应该正确设计出来的啊,在其他的译码测试的时候并没有出问题,这就比较奇怪,现在猜测是cell文件的储存方式的问题,也有可能是在生成校验矩阵之后才进行的mex编码,有什么东西被改变了
2.mex文件极容易使得matlab崩溃,一旦输入输出的内存超出,,少输入了值一类的问题,就会直接崩溃,检查cpp文件和matlab的工作区的各矩阵大小,一般而言可以发现问题
注意:最后的校验矩阵文件是‘cmatlab15009’,m文件时‘clonglong_final’,cpp文件是‘mexprin’

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值