Устранение Гаусса-Джордана над 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)))));