如何在python中进行换元矩阵乘法?

问题描述 投票:0回答:1

组合矩阵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
python python-3.x binary permutation matrix-multiplication
1个回答
1
投票

这个即使不快也比较短。

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

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']

0
投票

我目前做到的最好的结果是...

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
© www.soinside.com 2019 - 2024. All rights reserved.