拼接矩阵排列在Python中的块中完成

时间:2014-03-13 08:01:22

标签: python algorithm matrix permutation

我正在寻找python中的一种方法:一次只能通过矩阵的某些块进行置换。

具体来说,我想要一个矩阵,其中:

  1. 对角线由大小为n的正方形块组成
  2. 将其余的行和列分成相等大小的块,并将矩阵的大小替换为每个块中的每个块。
  3. 对此新矩阵运行测试,如果失败,则将新矩阵替换为P
  4. 如果不是那么清楚,这是我想要的图像: 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代码,所以很想听听任何人的建议。

1 个答案:

答案 0 :(得分: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