Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab GF(2)上的Gauss-Jordan消元法_Matlab_Math_Matrix_Information Theory_Galois Field - Fatal编程技术网

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