如何从生成集创建矩阵
How to create a matrix from a generating set
我正在尝试使用一些向量的生成集来形成矩阵 (v1, v2, v3)
,其中每个元素代表二进制数据。
我希望代码使用集合中的向量并创建一个矩阵,其中包含零向量、每个行向量以及组合 v1+v2
、v1+v3
、v2+v3
和 v1+v2+v3
,即。以 0
和 1
作为系数的所有可能的线性组合。
我试过使用 for 循环,但我以重复结束。我也可以通过执行每个操作来做到这一点,但这对于生成包含许多向量的集合是不可行的。
import numpy as np
A = np.matrix([[1,1,1,1,0,0,0,0],[0,0,1,1,1,1,0,0],[0,0,0,0,1,1,1,1]])
我想创建一个新矩阵,该矩阵由上述矩阵 A 的行向量的所有可能线性组合组成。
输出应包含以下内容:
[0,0,0,0,0,0,0,0],
[1,1,1,1,0,0,0,0],
[0,0,1,1,1,1,0,0],
[0,0,0,0,1,1,1,1],
[1,1,0,0,1,1,0,0],
[0,0,1,1,0,0,1,1],
[1,1,1,1,1,1,1,1],
[1,1,0,0,0,0,1,1]
我想这就是你想要的。
import numpy as np
from itertools import combinations
v = np.array([[1,1,1,1,0,0,0,0],[0,0,1,1,1,1,0,0],[0,0,0,0,1,1,1,1]]) # v1, v2, v3
l = [] # creating a list of possible combinations [(0, 1), (0, 2), (1, 2), (0, 1, 2)]
for j in range(2, v.shape[0]+1):
comb = combinations(np.arange(v.shape[0]), j)
for i in list(comb):
l.append(i)
final = np.zeros((len(l), v.shape[1])) # creating final matrix
for i in range(len(l)): # filling final matrix based on combinations
for j in (l[i]):
final[i] += v[j]
final = np.concatenate((np.zeros((1,v.shape[1])), v, final%2), axis=0)
#array([[0., 0., 0., 0., 0., 0., 0., 0.],
# [1., 1., 1., 1., 0., 0., 0., 0.],
# [0., 0., 1., 1., 1., 1., 0., 0.],
# [0., 0., 0., 0., 1., 1., 1., 1.],
# [1., 1., 0., 0., 1., 1., 0., 0.],
# [1., 1., 1., 1., 1., 1., 1., 1.],
# [0., 0., 1., 1., 0., 0., 1., 1.],
# [1., 1., 0., 0., 0., 0., 1., 1.]])
我看待这个问题的方式是你有一组系数:
coeffs = [0, 1]
目标是得到系数乘以向量的所有组合。从数学上讲,您想将以下系数应用于您的向量:
from itertools import chain, combinations_with_replacement, permuations
import numpy as np
A = np.matrix([[1,1,1,1,0,0,0,0],[0,0,1,1,1,1,0,0],[0,0,0,0,1,1,1,1]])
N = len(A)
all_coeffs = (
chain.from_iterable(
list(set(permutations(x, N))) for x in combinations_with_replacement(coeffs, N)
)
)
print(list(all_coeffs))
#[(0, 0, 0),
# (1, 0, 0),
# (0, 1, 0),
# (0, 0, 1),
# (0, 1, 1),
# (1, 1, 0),
# (1, 0, 1),
# (1, 1, 1)]
因此您需要将每个系数与 A
中的每一行进行点积,然后 "sum" 结果。由于您使用的是二进制数,因此可以使用 xor
运算符来实现加法运算。最后,您可以将结果连接在一起。
综合起来:
from functools import reduce
from operator import xor
N = len(A)
mat = np.concatenate(
[
reduce(xor, (a*b for a, b in zip(c, A)))
for c in (
chain.from_iterable(
list(set(permutations(x, N))) for x in
combinations_with_replacement(coeffs, N)
)
)
]
)
print(mat)
#[[0 0 0 0 0 0 0 0]
# [1 1 1 1 0 0 0 0]
# [0 0 1 1 1 1 0 0]
# [0 0 0 0 1 1 1 1]
# [0 0 1 1 0 0 1 1]
# [1 1 0 0 1 1 0 0]
# [1 1 1 1 1 1 1 1]
# [1 1 0 0 0 0 1 1]]
我正在尝试使用一些向量的生成集来形成矩阵 (v1, v2, v3)
,其中每个元素代表二进制数据。
我希望代码使用集合中的向量并创建一个矩阵,其中包含零向量、每个行向量以及组合 v1+v2
、v1+v3
、v2+v3
和 v1+v2+v3
,即。以 0
和 1
作为系数的所有可能的线性组合。
我试过使用 for 循环,但我以重复结束。我也可以通过执行每个操作来做到这一点,但这对于生成包含许多向量的集合是不可行的。
import numpy as np
A = np.matrix([[1,1,1,1,0,0,0,0],[0,0,1,1,1,1,0,0],[0,0,0,0,1,1,1,1]])
我想创建一个新矩阵,该矩阵由上述矩阵 A 的行向量的所有可能线性组合组成。
输出应包含以下内容:
[0,0,0,0,0,0,0,0],
[1,1,1,1,0,0,0,0],
[0,0,1,1,1,1,0,0],
[0,0,0,0,1,1,1,1],
[1,1,0,0,1,1,0,0],
[0,0,1,1,0,0,1,1],
[1,1,1,1,1,1,1,1],
[1,1,0,0,0,0,1,1]
我想这就是你想要的。
import numpy as np
from itertools import combinations
v = np.array([[1,1,1,1,0,0,0,0],[0,0,1,1,1,1,0,0],[0,0,0,0,1,1,1,1]]) # v1, v2, v3
l = [] # creating a list of possible combinations [(0, 1), (0, 2), (1, 2), (0, 1, 2)]
for j in range(2, v.shape[0]+1):
comb = combinations(np.arange(v.shape[0]), j)
for i in list(comb):
l.append(i)
final = np.zeros((len(l), v.shape[1])) # creating final matrix
for i in range(len(l)): # filling final matrix based on combinations
for j in (l[i]):
final[i] += v[j]
final = np.concatenate((np.zeros((1,v.shape[1])), v, final%2), axis=0)
#array([[0., 0., 0., 0., 0., 0., 0., 0.],
# [1., 1., 1., 1., 0., 0., 0., 0.],
# [0., 0., 1., 1., 1., 1., 0., 0.],
# [0., 0., 0., 0., 1., 1., 1., 1.],
# [1., 1., 0., 0., 1., 1., 0., 0.],
# [1., 1., 1., 1., 1., 1., 1., 1.],
# [0., 0., 1., 1., 0., 0., 1., 1.],
# [1., 1., 0., 0., 0., 0., 1., 1.]])
我看待这个问题的方式是你有一组系数:
coeffs = [0, 1]
目标是得到系数乘以向量的所有组合。从数学上讲,您想将以下系数应用于您的向量:
from itertools import chain, combinations_with_replacement, permuations
import numpy as np
A = np.matrix([[1,1,1,1,0,0,0,0],[0,0,1,1,1,1,0,0],[0,0,0,0,1,1,1,1]])
N = len(A)
all_coeffs = (
chain.from_iterable(
list(set(permutations(x, N))) for x in combinations_with_replacement(coeffs, N)
)
)
print(list(all_coeffs))
#[(0, 0, 0),
# (1, 0, 0),
# (0, 1, 0),
# (0, 0, 1),
# (0, 1, 1),
# (1, 1, 0),
# (1, 0, 1),
# (1, 1, 1)]
因此您需要将每个系数与 A
中的每一行进行点积,然后 "sum" 结果。由于您使用的是二进制数,因此可以使用 xor
运算符来实现加法运算。最后,您可以将结果连接在一起。
综合起来:
from functools import reduce
from operator import xor
N = len(A)
mat = np.concatenate(
[
reduce(xor, (a*b for a, b in zip(c, A)))
for c in (
chain.from_iterable(
list(set(permutations(x, N))) for x in
combinations_with_replacement(coeffs, N)
)
)
]
)
print(mat)
#[[0 0 0 0 0 0 0 0]
# [1 1 1 1 0 0 0 0]
# [0 0 1 1 1 1 0 0]
# [0 0 0 0 1 1 1 1]
# [0 0 1 1 0 0 1 1]
# [1 1 0 0 1 1 0 0]
# [1 1 1 1 1 1 1 1]
# [1 1 0 0 0 0 1 1]]