我有一个二进制矩阵A
(仅1
和0
),以及伽罗瓦域中的向量D
(256)。向量C
计算为:
C = (A^^-1)*D
其中A^^-1
表示A
中矩阵GF(2)
的逆矩阵,*
是乘法运算。结果向量C
必须位于GF(256)
中。我试着在Matlab中做到这一点。
A= [ 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]
D=[0;0;0;0;0;0;0;0;0;0;103;198;105;115]
A=gf(A,1);
D=gf(D,8); %%2^8=256
C=inv(A)*D
%% The corrected result must be
%%C=[103;187;125;210;181;220;161;20;175;175;187;187;220;115]
但是,对于上面的代码,我无法实现我的预期结果
C=[103;187;125;210;181;220;161;20;175;175;187;187;220;115]
它产生错误
Error using * (line 14)
Orders must match.
你能帮我实现预期的结果吗?
答案 0 :(得分:6)
错误
使用*(第14行)时出错 订单必须匹配。
之所以出现是因为Matlab不支持将标准数学运算(+
,*
,.*
,.^
,\
等)应用于Galois Fields不同的订单,GF(2)
和GF(256)
。反向操作inv(A)
是一个有效的操作,如果你自己shown执行它{@ 3}},它将成功并在{A
中生成反转GF(2)
1}}。当您尝试将inv(A)
和D
相乘时,您的计算会失败,因为这些伽罗瓦字段的顺序不匹配。
在这个例子中,没有必要明确地将A
定义为2阶的伽罗瓦域GF(2)
,因为GF(256)
中的乘法发生在GF(2)
中。那是1 + 1 = 0
。
如果我们因此修改为A
创建Galois字段的代码
A = gf(A, 8);
然后我们可以执行
C = inv(A)*D
产生
C = GF(2^8) array. Primitive polynomial = D^8+D^4+D^3+D^2+1 (285 decimal)
Array elements =
103
187
125
210
181
220
161
20
175
175
187
187
220
115
因此,{p> C
位于GF(256)
并产生预期结果。
答案 1 :(得分:3)
似乎有
A)计算中的理论错误或
B)MATLAB不支持的东西。
根据Galois field arithmetic(强调我的)中的文档:
部分概述。您可以对Galois执行算术运算 数组使用熟悉的MATLAB运算符,如下表所示。 无论何时操作一对Galois阵列,两个阵列都必须 在同一个Galois领域。
你的矩阵不是。
我不知道是哪一个,因为我不知道Galois字段是如何工作的