【问题标题】:Gauss-Jordan elimination over GF(2)GF(2) 上的 Gauss-Jordan 消元
【发布时间】:2017-06-10 08:55:34
【问题描述】:

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

                                    Hsys = [A | I]

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

Gauss-Jordan 消元法 可以很好地解决这个问题。 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 矩阵似乎是奇异的。还有其他类似的方法吗?

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

【问题讨论】:

  • 这里没有问题。
  • 我突出显示了查询以使其足够清楚,我希望没问题!
  • 有人知道吗?我仍然被困在这里......

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


【解决方案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

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

【讨论】:

  • 你好@Jonas,你的方法看起来不错,但在大多数情况下,输出是一个奇异矩阵,因此我无法继续。在那种情况下检查矩阵是否是奇异的并重复该过程不是任何可行的方法吗?您无法计算行列式,因为在大多数情况下它不是方阵,虽然我看到有人推荐使用 'rcond(A)' 和 'cond(A)',但结果也几乎相同当矩阵是奇异的或不是...
  • 而且矩阵越长,这种方法越不可能奏效...
  • @MisterTellini 这是一个简化版本,添加列交换之类的东西可以使其更加有效。但这一切都取决于您想要的代码结构和原始代码结构。归根结底,最好从一开始就设计具有所需结构的代码。
  • 但是我仍然不明白@Jonas。来自一个“gfrank”等于其行数的矩形矩阵,你的方法仍然无法奏效,因为它说矩阵是奇异的......
【解决方案2】:

我遇到了同样的问题,@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)))));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多