我有一个二进制矩阵A(只有1和0),以及伽罗瓦域中的向量D(256)向量C计算如下:
C = (A^^-1)*D
其中A ^^ - 1表示GF(2)中矩阵A的逆矩阵,*是乘法运算。结果向量C必须在GF(256)中。
但是,我只有一个矩阵A1是非方矩阵。通过删除A1的一些依赖行来创建等式中的上述矩阵A.以相同的方式,通过删除与A1中的删除行对应的一些元素来构造向量D.因此,我们可以解决上面的等式。我的问题是,我们可以在MATLAB中使用任何函数来执行上述步骤吗?
例如,我有A1是16x14矩阵,D1是16x1向量
A1 =[1 0 0 1 1 0 0 0 0 0 0 0 0 0
1 1 0 0 0 1 0 0 0 0 0 0 0 0
1 1 1 0 0 0 1 0 0 0 0 0 0 0
0 1 1 1 0 0 0 1 0 0 0 0 0 0
0 0 1 1 0 0 0 0 1 0 0 0 0 0
1 1 0 1 1 0 0 1 0 1 0 0 0 0
1 0 1 1 0 1 0 0 1 0 1 0 0 0
1 1 1 0 0 0 1 1 1 0 0 1 0 0
0 1 1 1 1 1 1 0 0 0 0 0 1 0
0 0 0 0 1 1 1 1 1 0 0 0 0 1
0 1 1 1 1 0 1 1 1 0 1 1 1 0
0 0 0 1 0 0 0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 1 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0 0 0 0 0
0 0 1 1 0 0 0 0 1 1 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 1 ]
D1=[0; 0; 0; 0 ; 0; 0 ; 0; 0 ; 0 ; 0 ; 103 ; 198 ; 105 ; 115; 175 ; 14]
在上面的例子中,我们需要从A1中删除两个依赖行/列,以获得A是14x14矩阵,D1也删除2个元素以获得D,然后我的预期结果是
C=A^^-1*D
C= [ 103; 187 ; 125; 210 ; 181; 220 ; 161 ; 20 ; 175; 175; 187; 187 ; 220 ; 115]
这就是我试过的
%%A1=gf(A1,8);
%%D1=gf(D1,8); %%2^8=256
%% Do something and last step is
%%C=inv(A)*D
[C,vld] = gflineq(A1,D1,8)
Or
C=gf(A1,8) \ gf(D1,8)
然而,这些方法没有返回我预期的C向量。我发现高斯消除可以起作用,但我不知道如何申请我的情况。你能给我一个正确的解决方案吗?
答案 0 :(得分:4)
首先,我无法访问"通信系统工具箱",因此为了在GF(2)
中操作,我必须添加mod(stuff,2)
来电代码,为了在GF(2^8)
中操作,我必须实现一个在这个字段中求和的函数。只需使用gf
定义变量,并在有权访问工具箱时删除这些调用。
先决条件:在GF(2^8)
总结:
GF(2^8)
中的求和并非易事,因为它的行为与(Z/2Z)^8
相似。
为了在这个领域求和,我有以下功能。
基本上,GF(2^8)
中的元素是8元组,每个元素在{0,1}
中取值。例如,(1,1,0,0,0,1,1,0)
就是其中之一。为了在这个字段中对两个元组求和,对于每个元素,它们都取Z/2Z
中的和。
例如,如果我们想要(0,0,0,1,0,0,0,1)
和(1,1,1,1,1,1,1,1)
之和:(请记住Z/2Z
,0+0=0
,0+1=1
,1+0=1
和{ {1}})
这些元组的第一个元素是1+1=0
和0
,因此总和的第一个元素将是1
。对所有元素执行此操作并获得:
0+1=1
该功能以相同的方式运作:
1)将输入转换为二进制数
2)比较每个数字。如果它们相等,则总计为(0,0,0,1,0,0,0,1)+(1,1,1,1,1,1,1,1)=(1,1,1,0,1,1,1,0)
,如果不相等,则总计为0 (0+0=0 , 1+1=0)
。
3)将结果转换回十进制数
1 (0+1=1 and 1+0=1)
GF(2)中的高斯消元在效率上与在R或C中完全相同,除非由于function [D] = SumInGF256(D1,D2)
%UNTITLED3 Summary of this function goes here
% Detailed explanation goes here
A=size(D1);
P=numel(D1);
D=zeros(A);
D1=dec2bin(D1,8);
D2=dec2bin(D2,8);
% TmpD=cell(A);
for jj=1:P
TmpD1=D1(jj,:);
TmpD2=D2(jj,:);
out='';
for ii=1:8
if isequal(TmpD1(ii),TmpD2(ii))
out=strcat(out,'0');
else
out=strcat(out,'1');
end
end
D(jj)=bin2dec(out);
end
这一事实而更容易。这是代码:
1+1=0
这里输出是你想要的:
C =
103 187 125 210 181 220 161 20 175 175 187 187 220 115
答案 1 :(得分:0)
首先,我要感谢BillBokeey的工作。但是,我在GF(256)工作,它比GF(2)更复杂。谷歌之后,我找到了一个很好的解决方案。这是rfc-6330的源代码。在该源代码中,他的函数是rfc6330_gaussian。对于我上面的问题,很容易通过
来应用它 C=rfc6330_gaussian( A1, D1 )
因此结果将类似于我的预期结果
C=[ 103
187
125
210
181
220
161
20
175
175
187
187
220
115]
这个ans。对于有类似问题的人来说会很有用。