【问题标题】:Splicing Matrix Permutations Done in Blocks in Python在 Python 中以块的形式拼接矩阵排列
【发布时间】:2014-03-13 08:01:21
【问题描述】:

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

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

  1. 对角线由大小为 n 且全为零的正方形块组成
  2. 将其余的行和列分成大小相等的块,并在矩阵中将该块的大小代入每个块中。
  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 代码不到 2 周,所以很想听听任何人的建议。

【问题讨论】:

  • 使用 numpy,它具有用于寻址矩阵块的本机语法。
  • 这个问题现在看起来很荒谬,因为我有几年的经验。
  • (几年前的最后一次编辑非常激烈,通常被认为是故意破坏。它可能比以前的版本更好,所以我已经回滚了)。
  • 不客气@par,这是服务的一部分。 :-)

标签: python algorithm matrix permutation


【解决方案1】:

当您的所有矩阵都是等长列表时,您可以编写一个函数将子矩阵放置在某个位置的较大矩阵上:

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

【讨论】:

  • 太棒了。谢谢你,我会试试这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 2018-07-17
  • 2013-03-05
  • 2016-05-12
相关资源
最近更新 更多