使用关联矩阵生成所有可能的图形的有效解决方案是什么? 这些问题相当于生成所有可能的二进制三角矩阵。 我的第一个想法是使用python和itertools。例如,用于生成所有可能的4x4矩阵
for b in itertools.combinations_with_replacement((0,1), n-3):
b_1=[i for i in b]
for c in itertools.combinations_with_replacement((0,1), n-2):
c_1=[i for i in c]
for d in itertools.combinations_with_replacement((0,1), n-1):
d_1=[i for i in d]
然后你创建矩阵添加相应的零数。 但这是不正确的,因为我们跳过了一些图表......
那么,有什么想法吗? 也许我可以使用R ^ n矩阵和R ^(n * n)向量之间的同构,并生成0和1的所有可能向量,然后将其切割成我的矩阵,但我认为这是一种更有效的解决方案。 / p>
谢谢
我添加了matlab选项卡,因为这是数值分析和matlab中的问题。
答案 0 :(得分:1)
以下是使用生成所有简单图形的numpy
的示例解决方案:
它首先生成上三角形部分iu
的索引。循环将数字k
转换为它的二进制表示,然后将其分配给上三角部分G[iu]
。
import numpy as np
n = 4
iu = np.triu_indices(n,1) # Start at first minor diagonal
G = np.zeros([n,n])
def dec2bin(k, bitlength=0):
return [1 if digit=='1' else 0 for digit in bin(k)[2:].zfill(bitlength)]
for k in range(0,2**(iu[0].size)):
G[iu] = dec2bin(k, iu[0].size)
print(G)
答案 1 :(得分:1)
我假设你想要低三角矩阵,对角线不需要为零。如果不是这样的话,可以很容易地修改代码。
n = 4; %// matrix size
vals = dec2bin(0:2^(n*(n+1)/2)-1)-'0'; %// each row of `vals` codes a matrix
mask = tril(reshape(1:n^2, n, n))>0; %// decoding mask
for v = vals.' %'// `for` picks one column each time
matrix = zeros(n); %// initiallize to zeros
matrix(mask) = v; %// decode into matrix
disp(matrix) %// Do something with `matrix`
end
每次迭代都给出了一个可能的矩阵。例如,n=4
的第一个矩阵是
matrix =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
matrix =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 1
matrix =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 1 0
matrix =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 1 1