组合矩阵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
这个即使不快也比较短。
def permmult(a,b):
return [b[-r] for r in a]
换元矩阵是一个很好的数学概念 但它并不是你用编程的方式对向量中的元素进行重新排序的方法 (除非你想用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']
我目前做到的最好的结果是...
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