zcabcd 2020-06-03
众所周知,alist文件是一种保存稀疏矩阵格式,常用于保存LDPC码的校验矩阵与生成矩阵。
Matrix File Formats?- TU Kaiserslautern提供了一个信道编码的数据库,并给出了数据库中信道编码的校验矩阵的存储方法和格式。
这种格式也见于alist format
Database of Channel Codes and ML Simulation Results从这里可以下载校验矩阵的alist文件。
读取alist文件中保存的矩阵,将稀疏矩阵保存为alist格式,有以下三种python方案(其中前两种,矩阵的行和列设定是一致的):
要注意的是,可能保存或读写的是想获得的稀疏矩阵的转置,在应用以上的脚本时,根据自己的需要和判断,决定加不加.T
最适合Matrix File Formats?- TU Kaiserslautern的python实现
import numpy as np import scipy.sparse as sps # 校验矩阵的读取 def alistToNumpy(lines): """Converts a parity-check matrix in AList format to a 0/1 numpy array. The argument is a list-of-lists corresponding to the lines of the AList format, already parsed to integers if read from a text file. The AList format is introduced on http://www.inference.phy.cam.ac.uk/mackay/codes/alist.html. This method supports a "reduced" AList format where lines 3 and 4 (containing column and row weights, respectively) and the row-based information (last part of the Alist file) are omitted. Example: alistToNumpy([[3,2], [2, 2], [1,1,2], [2,2], [1], [2], [1,2], [1,2,3,4]]) array([[1, 0, 1], [0, 1, 1]]) """ nCols, nRows = lines[0] if len(lines[2]) == nCols and len(lines[3]) == nRows: startIndex = 4 else: startIndex = 2 matrix = np.zeros((nRows, nCols), dtype=np.int) for col, nonzeros in enumerate(lines[startIndex:startIndex + nCols]): for rowIndex in nonzeros: if rowIndex != 0: matrix[rowIndex - 1, col] = 1 return matrix def save_alist(name, mat, j=None, k=None): H=np.copy(mat) # H=H.T ‘‘‘ Function converts parity check matrix into the format required for the LDPC decoder ‘‘‘ if j is None: j=int(max(H.sum(axis=0))) if k is None: k=int(max(H.sum(axis=1))) m, n = H.shape # rows, cols f = open(name, ‘w‘) print(n, m, file=f) print(j, k, file=f) for col in range(n): print( int(H[:, col].sum()), end=" ", file=f) print(file=f) for row in range(m): print( int(H[row, :].sum()), end=" ", file=f) print(file=f) for col in range(n): for row in range(m): if H[row, col]: print( row+1, end=" ", file=f) print(file=f) for row in range(m): for col in range(n): if H[row, col]: print(col+1, end=" ", file=f) print(file=f) f.close() def alist2sparse(file_H): # reads binary parity check matrix in "alist" format from file # Example # H = alist2sparse(‘A‘); % A is the ascii file in alist format with open(file_H) as f: lines = f.readlines() new_lines = [] for line in lines: new_lines.append(list(map(int, line.split()))) H_matrix = alistToNumpy(new_lines) return H_matrix def test_save_alist(): hamming_matrix=np.array([[1,0,0,1,1,0,1], [0,1,0,1,0,1,1], [0,0,1,0,1,1,1]]) save_alist("hamming_d_3.alist",hamming_matrix) def test_alist2sparse(): H=alist2sparse(‘hamming_d_3.alist‘) print(H) if __name__=="__main__": # main() test_save_alist() test_alist2sparse()