在matlab中求解二元线性方程
solving binary linear equation in matlab
考虑形式为 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 域
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()
结合使用,您应该能够让它工作
要求解x
二进制形式,矩阵A应该在伽罗瓦域中。
考虑以下示例;
>> 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 = gf(A)
.
将矩阵 A
转换为伽罗华域
考虑形式为 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 域
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()
结合使用,您应该能够让它工作
要求解x
二进制形式,矩阵A应该在伽罗瓦域中。
考虑以下示例;
>> 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 = gf(A)
.
A
转换为伽罗华域