2014-03-13 36 views
-1

我正在寻找一种方法在Python中:一次只排列矩阵的某些块。拼接矩阵排列在Python中的块中完成

具体而言,我想要一个矩阵,其中:

  1. 对角线包含全零
  2. divding行和列分成相等大小的块的其余部分的大小为n的正方形块,而代以在将该块的大小矩阵分配到每个块中。
  3. 运行这个新的矩阵测试,如果失败了,换个新的矩阵为P

这里是什么,我想,如果不是那么清晰的图像: http://s27.postimg.org/syimn1zvn/photo.jpg

其中P [i]是由一行所定义的矩阵:

for per in itertools.permutations(range(n)): 
     matrix = [[0 for x in xrange(n)] for x in xrange(n)] 
     for i, j in enumerate(per): 
      matrix[i][j] = 1 
     print matrix 

如果这些行中的一个未得到满意的结果,一旦输入到矩阵我想与第二行以替换块。现在

,我已经做了类似的工作,我只与拼接特定线路的工作,然后通过所有可能的排列运行,如:

 row = list(perm_unique([1,0])) #this gives the unique permutations of the items 
    zs = list((0,0)) 

    for a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 in product(row, repeat=12): 

     M, N, O, P, Q, R, = ([] for i in range(6)) 

     M = list(chain(zs,a1,a2)) 
     N = list(chain(zs,a3,a4)) 
     O = list(chain(a5,zs,a6)) 
     P = list(chain(a7,zs,a8))   
     Q = list(chain(a9,a10,zs)) 
     R = list(chain(a11,a12,zs)) 

     A = list() 
     A.append(M) 
     A.append(N) 
     A.append(O) 
     A.append(P) 
     A.append(Q) 
     A.append(R) 

     B = np.asarray(A) 

不幸的是,我发现它非常难找到方法来做同样的过程,但用块或小矩阵代替简单的线。如果有人可以给我任何想法或批评。我只学习了如何编写Python不到两周的时间,所以很想听到任何人的建议。

+0

使用numpy,它具有用于寻址矩阵块的本地语法。 –

+0

这个问题现在看起来很荒谬,我有几年的经验。 – prappolt

+0

(几年前的最后一次编辑如此激烈,在这里通常被认为是破坏行为,在之前的版本中可能会更好,所以我已经回滚了)。 – halfer

回答

0

当你所有的矩阵是等长的列表的列表,你可以写一个函数来放置一个小矩阵在更大的矩阵在某个位置:

def place_submatrix(M, A, i, j): 
    """Place submatrix A in M wit top left corner (i, j)""" 

    for ii in range(len(A)): 
     for jj in range(len(A)): 
      M[i + ii][j + jj] = A[ii][jj] 

这不是动态的像L.append(X)L += [X]。它要求有一个适当的大矩阵已经存在。例如:

M = [[0 for x in xrange(9)] for x in xrange(9)] 

A = [ 
    [[44, 98, 23], [56, 93, 54], [83, 92, 72]], 
    [[72, 37, 58], [10, 17, 42], [40, 36, 74]], 
    [[48, 72, 39], [34, 98, 56], [87, 33, 66]], 
    [[90, 61, 16], [50, 98, 52], [81, 56, 77]], 
    [[13, 62, 86], [40, 53, 29], [39, 51, 14]], 
    [[23, 36, 91], [22, 76, 27], [58, 12, 91]] 
] 

pos = [(0, 3), (0, 6), (3, 0), (3, 6), (6, 0), (6, 3)] 

for p, a in zip(pos, A): 
    row, col = p 
    place_submatrix(M, a, row, col) 

然后在此处添加另一个循环以覆盖子列表A

+0

太好了。谢谢,我会试试这个。 – prappolt