为了账号安全,请及时绑定邮箱和手机立即绑定

如何在python中执行置换矩阵乘法?

如何在python中执行置换矩阵乘法?

素胚勾勒不出你 2022-11-01 16:58:41
置换矩阵 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
查看完整描述

3 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

置换矩阵是一个很好的数学概念,但它们不是您以编程方式处理向量中元素重新排序的方式(除非您尝试使用 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']


查看完整回答
反对 回复 2022-11-01
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

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

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



查看完整回答
反对 回复 2022-11-01
?
杨魅力

TA贡献1811条经验 获得超6个赞

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


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


查看完整回答
反对 回复 2022-11-01
  • 3 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信