在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 转换为伽罗华域