海明码(Hamming Code):用python实现矩阵思路

海明码中各个矩阵的原理:

https://blog.csdn.net/weixin_57915039/article/details/117523933?spm=1001.2014.3001.5501

 

本人初学python,代码仅供思路分享~ (优化不行)

 

一、

import numpy as np

def Change_Type(num_list):
  num_list_new = [int(i) for i in num_list]
  return num_list_new

def Sequence_adjustment(list_created):
  M=np.mat((np.array([list_created])))
  print(M)

1. 引入numpy

2. 定义Change_Type函数,功能为把list里的str转成int

3. 定义Sequence_adjustment,功能为把list变成矩阵的样子(美观)

 

二、

message=input('Input the message: ')

y=len(message)
print('the length of message y is: ', y)

p=0
while 2**p<p+1+y:
    p=p+1
print('the number of parity bits are: ', p)

x=y+p
print('the total length of hamming code is: ', x)

m = Change_Type(message)
print('the message is: ', m)
print('\n')

4. 输入信息

5. 计算信息长度y

6. 利用while循环计算2^p>=p+1+y的整数最小值,p为奇偶校验位数量

7. 可以通过信息长度y加上奇偶校验位数量p得到海明码总长x

8. 利用Change_Type函数,把输入的信息放到list并转成int

 

三、

Ht=[]
for i in range(1, x+1):

  DEC_to_BIN = bin(i)[2:].zfill(p)
  L = list(reversed(Change_Type(DEC_to_BIN)))
  Ht.append(L)

9. 生成一个Ht列表(矩阵),将1到x(海明码总长)的数转成二进制,并向右对齐,然后进行reversed。

 

四、

Ht_tool=[]
for i in range(1,x+1):

  DEC_to_BIN = bin(i)[2:].zfill(p)
  L = list(reversed(Change_Type(DEC_to_BIN)))
  Ht_tool.append(L)

np.transpose(Ht_tool)
H=np.transpose(Ht_tool).tolist()

H_tool=H

10. 再生成一个Ht_tool,和上面算法一模一样,只是为了让Ht保持独立

11. 用np.transpose把整个Ht_tool(即Ht)矩阵 “翻过来”

效果如下:

12. 设置H_tool让H独立

 

五、

Parity_bit_list=[]
for j in range(0,p):
    Parity_bit_list.append(2**j)

Parity_bit_list.reverse()
for i in Parity_bit_list:
    del Ht_tool[i-1]

import numpy as np
np.transpose(Ht_tool)
H_tool=np.transpose(Ht_tool).tolist()
h=H_tool

13. 生成一个奇偶校验位位置的列表。

效果为:如p=3,即生成 [ 1, 2, 4 ]; 如p=4,即生成 [ 1, 2, 4, 8 ];

14. 将生成的奇偶校验位列表翻转,然后把Ht矩阵里对应奇偶校验位的行删除。

将奇偶校验位列表翻转可以避免:del每次循环都会生成一个新的表格,如果从低位开始减会出现第一次减第1个元素,第二次减新表格的第2个元素,从而出现bug。

15. 将减掉奇偶校验位的行的矩阵进行翻转,可以得到新矩阵h

 

六、

print("The Ht matrix of the message is: ")
Sequence_adjustment(Ht)
print('\n')

print("The H matrix of the message is: ")
Sequence_adjustment(H)
print(type(H))
print('\n')

print("The h matrix of the message is: ")
Sequence_adjustment(h)
print('\n')

16. 将各个list用Sequence_adjustment函数输出并变成矩阵的样子。

 

 

下面为完整代码~

# by ziki

import numpy as np

def Change_Type(num_list):
  num_list_new = [int(i) for i in num_list]
  return num_list_new

def Sequence_adjustment(list_created):
  M=np.mat((np.array([list_created])))
  print(M)

############################################################################

message=input('Input the message: ')

y=len(message)
print('the length of message y is: ', y)

p=0
while 2**p<p+1+y:
    p=p+1
print('the number of parity bits are: ', p)

x=y+p
print('the total length of hamming code is: ', x)

m = Change_Type(message)
print('the message is: ', m)
print('\n')


#############################################################################

Ht=[]
for i in range(1, x+1):

  DEC_to_BIN = bin(i)[2:].zfill(p)
  L = list(reversed(Change_Type(DEC_to_BIN)))
  Ht.append(L)

Ht_tool=[]
for i in range(1,x+1):

  DEC_to_BIN = bin(i)[2:].zfill(p)
  L = list(reversed(Change_Type(DEC_to_BIN)))
  Ht_tool.append(L)

# Ht_tool can make H independent


np.transpose(Ht_tool)
H=np.transpose(Ht_tool).tolist()

H_tool=H
# H_tool can make H independent

Parity_bit_list=[]
for j in range(0,p):
    Parity_bit_list.append(2**j)

Parity_bit_list.reverse()
for i in Parity_bit_list:
    del Ht_tool[i-1]

import numpy as np
np.transpose(Ht_tool)
H_tool=np.transpose(Ht_tool).tolist()
h=H_tool

print("The Ht matrix of the message is: ")
Sequence_adjustment(Ht)
print('\n')

print("The H matrix of the message is: ")
Sequence_adjustment(H)
print(type(H))
print('\n')

print("The h matrix of the message is: ")
Sequence_adjustment(h)
print('\n')

 

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值