2

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

                                    Hsys = [A | I]

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

Gauss-Jordan 消元法可以很好地解决这个问题。Matlab 有一个特定的命令 ,rref用于此目的,但是在我们的例子中处理 GF(2) 时它不再有效。浏览互联网,我在 Github 中发现了一个潜在的合适的解决方案来克服这个缺点。然而,它并不总是奏效。

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

您可以在下面找到三个可以应用 Gauss-Jordan 消元(超过 GF(2))的非标准奇偶校验矩阵样本。由于应该始终有一种方法可以将任何矩阵安排为系统化,因此我需要一种适用于任何维度矩阵的方法。

这些第一个样本取自sid 在 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)可以在我的 Dropbox 的这个链接中找到。

编辑于 21/06/2017

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

预先感谢您,并致以最诚挚的问候。

4

2 回答 2

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

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

于 2017-06-10T19:17:07.847 回答
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)))));
于 2020-07-28T07:03:47.427 回答