我需要将奇偶校验矩阵H
(仅由1和0组成)从非标准形式转换为标准形式,这表示为:
Hsys = [A | I]
H
和Hsys
共享相同的维度:(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中找到。
@Jonas提出的解决方案在某些情况下解决了,但在大多数情况下都没有,因为H矩阵似乎是单数。还有其他类似的方法吗?
提前感谢,并致以最诚挚的问候。
答案 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)))));