【问题标题】:How to perform permutation matrix multiplication in python?如何在python中执行置换矩阵乘法?
【发布时间】:2020-04-30 16:22:35
【问题描述】:

置换矩阵 A 和 B 是方阵,每行仅包含一个 1。所有行都是唯一的。 我已经添加了我的第一次尝试作为答案。我希望有人有更快的解决方案。

def permmult(a, b):
    """Multiply two permutation matrices.

     a,b: lists of positive integers and zero."""
    c = []
    for row in a:
        c.append(b[-row])
    return c

【问题讨论】:

  • 你觉得能做到多快?
  • 您能否提供一个示例输入和输出。您最初声明 A 和 B 是置换矩阵(仅包含 1 和 0)与您在代码中对变量 a,b 的评论相矛盾。除非您使用 numpy 并且忘记告诉我们,否则代码假定有两个列表(不是矩阵)。此外,如果 a 和 b 仅包含 1 和 0,则生成的 c 将是 b 的第一个和最后一个元素的组合。

标签: python python-3.x binary permutation matrix-multiplication


【解决方案1】:

置换矩阵是一个很好的数学概念,但它们不是您以编程方式处理向量中元素重新排序的方式(除非您尝试使用 numpy 做一些特殊的事情)。

从重新排序的索引的向量 (K) 创建一个置换矩阵 (P) 可以这样完成:

def pMatBuild(A):
    return [ [int(a==b) for b in range(len(A))] for a in A ]

K = [0,3,1,4,2]
P = pMatBuild(K)

输出:

for line in P: print(line)

[1, 0, 0, 0, 0]
[0, 0, 0, 1, 0]
[0, 1, 0, 0, 0]
[0, 0, 0, 0, 1]
[0, 0, 1, 0, 0]

将此置换矩阵应用于另一个向量(即相乘)可以这样完成:

def pMatApply(P,V):
    return [ V[row.index(1)] for row in P ] # inefficient lookup of 1 on each row

输出:

V = "ABCDE"    
print(pMatApply(P,V))

['A', 'D', 'B', 'E', 'C']

但是,在代码中,比置换矩阵更有效的是使用原始索引向量 K:

V = "ABCDE"
print([V[i] for i in K])
['A', 'D', 'B', 'E', 'C']

【讨论】:

    【解决方案2】:

    如果不是更快的话,这会更短:

    def permmult(a,b):
        return [b[-r] for r in a]
    

    【讨论】:

    • 确实快一点。
    【解决方案3】:

    迄今为止我取得的最好成绩......

    def permmult(a, b):
        """Multiply two permutation matrices.
    
         a,b: lists of positive integers and zero."""
        c = []
        for row in a:
            c.append(b[-row])
        return c
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多