Matlab GF(2)上的Gauss-Jordan消元法
我需要将奇偶校验矩阵Matlab GF(2)上的Gauss-Jordan消元法,matlab,math,matrix,information-theory,galois-field,Matlab,Math,Matrix,Information Theory,Galois Field,我需要将奇偶校验矩阵H(仅由1和0组成)从非标准形式转换为标准形式,即表示为: Hsys = [A | I] H和Hsys共享相同的维度:(n-k,n)I对应于维度(n-k)的单位矩阵 高斯-乔丹消去法可以方便地解决这个问题。Matlab有一个特定的命令,rref,用于此目的,但是它在处理GF(2)时不再有效,就像我们的例子一样。浏览互联网以克服这个缺点。然而,这并不总是可行的 我还尝试过做HH=mod(rref(H),2
H
(仅由1和0组成)从非标准形式转换为标准形式,即表示为:
Hsys = [A | I]
H
和Hsys
共享相同的维度:(n-k,n)
<上面的代码>I对应于维度(n-k)
的单位矩阵
高斯-乔丹消去法可以方便地解决这个问题。Matlab有一个特定的命令,rref
,用于此目的,但是它在处理GF(2)时不再有效,就像我们的例子一样。浏览互联网以克服这个缺点。然而,这并不总是可行的
我还尝试过做HH=mod(rref(H),2)
,但根本不起作用,因为许多输出元素不是二进制的
在下面,您可以找到三个非标准奇偶校验矩阵样本,其中可以应用高斯-乔丹消元法(在GF(2)上)。由于总是有办法将任何矩阵系统化,我需要一种能处理任何维度矩阵的方法。
这些第一个样本取自,但尚未回复:
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)
的矩阵,可在中找到
2017年6月21日编辑
@Jonas提出的解决方案在某些情况下有效,但在大多数情况下无效,因为H矩阵似乎是奇异的。还有其他类似的方法吗
提前向您表示感谢,并致以最良好的问候。以下是我的做法(使用高斯-乔丹消去法):
如果这不能解决您的问题,请告诉我。我也遇到过同样的问题,@jonas代码也产生了大部分奇异矩阵错误。你可以试试下面的代码,我发现这对搜索H的系统形式很有帮助
% 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)))));
%Gauss-Jordan消去法
互换=零(m,2);
互换数量=1;
n=尺寸(H,2);
m=尺寸(H,1);
j=1;
指数=1;
虽然indexI在这里没有看到问题,但我强调了调查,以使其足够清楚,我希望这是可以的!有人有线索吗?我仍然被困在这里……你好@Jonas,你的方法看起来不错,但在大多数情况下,输出是一个奇异矩阵,因此我无法继续。难道没有任何可行的方法来检查矩阵是否奇异,并在这种情况下重复这个过程吗?你不能计算行列式,因为在大多数情况下它不是一个平方矩阵,尽管我看到有人推荐使用“rcond(a)”和“cond(a)”,但无论矩阵是单数还是非单数,结果都几乎相同……而且矩阵越长,这是一个简化的版本,添加列交换这样的东西可以使它更加有效。但这完全取决于您想要的代码结构和原始代码结构。在一天结束的时候,最好首先用所需的结构来设计代码。但是,我仍然不理解@Jonas。从一个“gfrank”等于其行数的矩形矩阵出发,您的方法仍然无法工作,因为它说矩阵是奇异的。。。
% 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)))));