Устранение Гаусса-Джордана над GF(2)

Мне нужно преобразовать матрицу проверки на четность H (который состоит только из единиц и нулей) от нестандартной до стандартной формы, то есть выразить это как:

                                    Hsys = [A | I]

H а также Hsys разделить одно и то же измерение: (n-k,n), I Выше соответствует единичная матрица измерения (n-k),

Устранение Гаусса-Иордана пригодится для решения этой проблемы. Matlab имеет определенную команду, rref, для этой цели, однако, это больше не действует при работе над GF(2), как в нашем случае. Просматривая Интернет, я нашел в Github потенциально подходящее решение для преодоления этого недостатка. Однако это не всегда получается.

Я тоже пытался делать HH = mod(rref(H),2), который не работал вообще, так как многие выходные элементы не были двоичными.

Здесь ниже вы можете найти три образца нестандартных матриц контроля четности, в которых может применяться исключение Гаусса-Джордана (над GF(2)). Поскольку всегда должен быть способ систематизировать любую матрицу, мне нужен метод, который работает с матрицами любого измерения.

Этот первый пример взят из поста sid в Stackru, но пока не ответил:

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-матрица кажется единственной. Любой другой подобный способ сделать это?

Заранее спасибо и всего наилучшего.

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];


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 также вызвал в основном сингулярную матричную ошибку. вы можете попробовать следующий код, который я считаю полезным при поиске систематической формы 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)))));
Другие вопросы по тегам