高斯 - 乔丹消除GF(2)

时间:2017-06-10 08:55:34

标签: matlab math matrix information-theory galois-field

我需要将奇偶校验矩阵H(仅由1和0组成)从非标准形式转换为标准形式,这表示为:

                                    Hsys = [A | I]

HHsys共享相同的维度:(n-k,n)。上面的I对应于维度(n-k)的单位矩阵。

高斯 - 乔丹消除可以解决这个问题。为此目的,Matlab有一个特定的命令rref,但是在我们的情况下,它在GF(2)上工作时不再有效。浏览互联网I found in Github a potentially suitable solution以克服这个缺点。然而,它并不总是有效。

我也尝试过HH = mod(rref(H),2),它根本不起作用,因为许多输出元素都不是二进制文件。

在下面,您可以找到三个非标准奇偶校验矩阵样本,其中可以应用Gauss-Jordan消除(通过GF(2))。因为总是应该有一种方法来安排任何矩阵是系统的,我需要一种方法来处理任何维度的矩阵。

这些第一个样本来自sid's post in Stackoverflow,尚未回复:

H=[1 0 1 1 0; 
   0 0 1 0 1; 
   1 0 0 1 0; 
   1 0 1 1 1];

H=[1 1 0 1 1 0 0 1 0 0;
   0 1 1 0 1 1 1 0 0 0;
   0 0 0 1 0 0 0 1 1 1;
   1 1 0 0 0 1 1 0 1 0;
   0 0 1 0 0 1 0 1 0 1];

最后一个是维(50x100)的矩阵,可以在this link to my Dropbox中找到。

编辑于2017年6月21日

@Jonas提出的解决方案在某些情况下解决了,但在大多数情况下都没有,因为H矩阵似乎是单数。还有其他类似的方法吗?

提前感谢,并致以最诚挚的问候。

2 个答案:

答案 0 :(得分:1)

以下是我如何做到这一点(使用Gauss-Jordan消除):

H=[1 1 0 1 1 0 0 1 0 0;
   0 1 1 0 1 1 1 0 0 0;
   0 0 0 1 0 0 0 1 1 1;
   1 1 0 0 0 1 1 0 1 0;
   0 0 1 0 0 1 0 1 0 1];


rows = size(H, 1);
cols = size(H, 2);

r = 1;
for c = cols - rows + 1:cols
    if H(r,c) == 0
        % Swap needed
        for r2 = r + 1:rows
            if H(r2,c) ~= 0
                tmp = H(r, :);
                H(r, :) = H(r2, :);
                H(r2, :) = tmp;
            end
        end

        % Ups...
        if H(r,c) == 0
            error('H is singular');
        end
    end

    % Forward substitute
    for r2 = r + 1:rows
        if H(r2, c) == 1
            H(r2, :) = xor(H(r2, :), H(r, :));
        end
    end

    % Back Substitution
    for r2 = 1:r - 1
        if H(r2, c) == 1
            H(r2, :) = xor(H(r2, :), H(r, :));
        end
    end

    % Next row
    r = r + 1;
end

如果这不能解决您的问题,请告诉我。

答案 1 :(得分:0)

我遇到了同样的问题,@ jonas代码也产生了大多数奇异矩阵错误。您可以尝试以下代码,这些代码在搜索H的系统形式时很有用。它还包括G的计算。

% Gauss-Jordan elimination 
swaps=zeros(m,2);
swaps_count=1;

n=size(H, 2);
m=size(H, 1);

j=1;
index=1;
while index<=m
    i=index;
    while (HH(i,j)==0)&(i<m)
        i=i+1;
    end
    if HH(i,j)==1
        temp=HH(i,:);
        HH(i,:)=HH(index,:);
        HH(index,:)=temp;
        for i=1:m
            if (index~=i)&(HH(i,j)==1)
                HH(i,:)=mod(HH(i,:)+HH(index,:),2);
            end
        end
        swaps(swaps_count,:)=[index j];
        swaps_count=swaps_count+1;
        index=index+1;
        j=index;
    else
        j=j+1;
    end
end

for i=1:swaps_count-1
    temp=HH(:,swaps(i,1));
    HH(:,swaps(i,1))=HH(:,swaps(i,2));
    HH(:,swaps(i,2))=temp;
end

G=[(HH(:,m+1:n))' eye(n-m)];

for i=swaps_count-1:-1:1
    temp=G(:,swaps(i,1));
    G(:,swaps(i,1))=G(:,swaps(i,2));
    G(:,swaps(i,2))=temp;
end

disp(sum(sum((mod(H*G',2)))));