Как выполнить умножение матрицы перестановок на python? - PullRequest
0 голосов
/ 30 апреля 2020

Матрицы перестановок A и B являются квадратными и содержат только одну единицу в каждой строке. Все ряды уникальны. Я добавил свою первую попытку в качестве ответа. Я надеюсь, что у кого-то есть более быстрое решение.

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 ]

1 голос
/ 30 апреля 2020

Это короче, если не быстрее:

def permmult(a,b):
    return [b[-r] for r in a]
1 голос
/ 01 мая 2020

Матрицы перестановок - хорошая математическая концепция, но они не подходят для программного переупорядочения элементов в векторе (если только вы не пытаетесь сделать что-то особенное с numpy).

Создание матрицы перестановок (P) из вектора (K) переупорядоченных индексов можно сделать следующим образом:

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)

output:

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

output:

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 голосов
/ 30 апреля 2020

Лучшее, что я достиг на сегодня ...

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
...