因为毕设仿真的需要,今天遇到了这个问题。将自己遭遇到的困难和解决的办法记录下来。
首先描述一下我需要解决的问题。
对于线性分组码,其全部码字的产生都是通过生成矩阵G矩阵得到,而c=u*G,故而如果需要产生全部的c,则需要全部的u。从初步思考来看只需将u矩阵进行穷举即可,但是对于(n,k)码中较大的k时——意味着有2^k个码字,这么做既不方便,也失去的仿真的意义。所以需要换一种思路产生u矩阵。
一开始我也没觉得这个是个问题,因为现在的计算机CPU的主频已经达到如此高的频率,仿真个这些代码应该不在话下,毕竟从算法分析上来讲只是O(n)的复杂度,但是我错误估计了形势——面对(512,256)的LDPC码的时候我瞬间明白自己摊上事儿了,摊上大事儿了——这个在我有生之年是不太可能跑出来u矩阵的,更不说和G矩阵相乘产生c码字了,当然LDPC码产生G是另一个麻烦的问题,但是这里在第一步就没办法进行了下去。因为2^256≈1.16*10^77,也就是说我的笔记本一刻不停地跑,也至少需要1.53*10^60年才能完成这个巨大的任务——那个时候或许宇宙都不存在了吧...
通过和师兄等交流后我才恍然明白这一类仿真只需要仿真一定数量点即可,并不需要全部的码字——一般选取的N=10000。于是目前面临的问题就变成了如何在2^k个码字中选取出互不重复的N个码字出来。
师兄给了一个比较简单的代码来解决这个问题:
u = (rand(1,576)>0.5)
再在外面套一层N圈的循环即可实现。
但是仔细一想,这个跟我的初衷有一定违背,毕竟这个有可能产生相同的u,因为不能保证在N次循环内产生的u矩阵不重复。为了算法的严谨和数据的准确,只能想其他的办法。
我想到的思路是:先生成0~2^k-1的十进制数,然后转为二进制数,取出每一位,再添上不足矩阵长度的零。
这里面有两个问题需要解决的是:生成不重复的十进制随机数、取出对应位并补足。后面的那个问题比较好解决,通过矩阵运算即可