考虑形式x*A = b
的二元线性方程。我想解决 x ,效率方法是避免使用x = b*inv(A)
而是使用x= b/A
。但是使用此命令结果不是二进制形式。我尝试了命令x = mod(b/A ,2)
,但结果仍然不是二进制文件。如何解决这个问题?
示例 `
x = 1 0 1 1 0 0 0 1 1 0`
和矩阵A是
`0 1 0 1 0 0 1 1 1 1
0 1 1 1 1 1 1 1 0 1
0 0 1 0 1 1 0 1 1 1
1 0 0 1 1 1 1 1 1 1
1 1 0 0 1 1 0 0 0 0
0 1 1 1 0 1 1 0 1 0
0 0 1 1 0 0 0 1 0 0
1 1 1 1 0 1 0 1 1 1
1 0 1 0 1 1 1 0 1 1
1 1 1 0 0 0 1 1 0 0`
which is full rank.
然后
>> b = mod (x*A,2)
b =
1 0 1 1 1 0 1 0 1 1
要查找x
,我正在
>> k = b / A
k =
第1至6栏
1.3750 -0.5000 -0.7500 -0.7500 0.8750 -0.5000
第7至10栏
1.8750 -0.5000 2.1250 -0.7500
或者如果使用模数2,结果是
>> k = mod (b / A,2)
k =
第1至6栏
1.3750 1.5000 1.2500 1.2500 0.8750 1.5000
第7至10栏
1.8750 1.5000 0.1250 1.2500
那么,我怎样才能以相同的二进制形式获得x
?顺便说一下,矩阵都是 class double 而不是 galois field
答案 0 :(得分:2)
Mathworks的这个例子展示了如何用MATLAB执行布尔矩阵求逆,我相信你的问题可以解答。
我还没有完全正常工作,但我相信您需要使用mod()
和logical()
的组合,例如:
A=logical(A);
b=(mod(x*A,2));
inverseA= ~A;
k=mod(b*inverseA,2)
这给出了
k=[1 1 0 0 1 1 0 1 0 0]
这不是x,但我认为如果您使用logical
函数和逻辑运算与mod()
一起使用,您应该可以使其工作
答案 1 :(得分:0)
要以二进制形式求解x
,矩阵 A 应该在galois字段中。
考虑以下示例;
>> x = randi ([0 1],1,10)
x =
1 1 0 1 1 1 0 1 1 1
>> A = gf (randi([0 1],10,10))
A = GF(2)阵列。
数组元素=
第1至6栏
1 1 1 0 0 1
1 0 1 0 1 0
1 0 1 1 0 1
0 0 0 0 0 1
1 1 1 0 1 1
0 1 0 1 0 1
0 0 0 1 1 1
0 1 0 0 1 0
0 0 1 0 1 0
0 0 1 0 0 1
第7至10栏
1 1 0 0
1 0 1 1
1 1 0 0
0 0 1 0
1 1 1 1
0 1 1 1
1 0 1 0
1 1 1 0
1 0 0 0
1 1 1 0
然后,
>> b = x*A
b = GF(2)数组。
数组元素=
第1至6栏
1 0 1 1 0 1
第7至10栏
0 1 0 1
>> x_solved = b*inv (A)
x_solved = GF(2)数组。
数组元素=
第1至6栏
1 1 0 1 1 1
第7至10栏
0 1 1 1
如您所见 x_solved 与原始 x 相同。因此,您只需运行代码A
即可将矩阵A = gf(A)
转换为galois字段。