Матрица умножения Python - строки матрицы не разделены - PullRequest
0 голосов
/ 11 ноября 2019

В настоящее время я пытаюсь выполнить матричное мульт на python, и появляется правильный ответ, но вместо того, чтобы каждая строка была отдельной, все строки объединяются в одну строку, а затем повторяются для количества строк.

def matrixtranspose(m1):
    mT = [[m1[i][x] for i in range(len(m1))] for x in range(len(m1[0]))]
    return mT

def dotProduct(m1row, m2column):
    l3 = [m1row[i] * m2column[i] for i in range(len(m1row))]
    dP = sum(l3)
    return dP

def matrixmult(m1, m2):
    transposedMatrix = matrixtranspose(m2)
    numRows = len(transposedMatrix)
    newMatrix = []
    addedDP = []

    for rows in range(0, (len(m1))):
            for col in range(0, len(transposedMatrix)):
                addedDP.append(dotProduct(m1[rows], transposedMatrix[col]))
            newMatrix.append(addedDP)

    return newMatrix

это вернет:

[[4, 20, 4, 4, 20, 4, 6, 36, 6],
 [4, 20, 4, 4, 20, 4, 6, 36, 6],
 [4, 20, 4, 4, 20, 4, 6, 36, 6]]

Вместо:

[[4, 20, 4] [4, 20, 4] [6, 36, 6]]

как я могу это исправить?

1 Ответ

0 голосов
/ 11 ноября 2019

Проблема в логике вашего аккреции:

addedDP = []

for row in range(0, (len(m1))):
    for col in range(0, len(transposedMatrix)):
        addedDP.append(dotProduct(m1[row], transposedMatrix[col]))

Вы добавляете каждый элемент к addedDP при прохождении матрицы: каждый продукт добавляется в глобальный списокзначений, а не только значения для текущей строки. addedDP не сбрасывается для каждой новой строки. И затем для каждой строки в матрице:

    newMatrix.append(addedDP)

вы добавляете исходную ссылку во весь список. Таким образом, когда вы закончите, у вас будет len(m1) копий этого списка в вашем списке «результатов».

Это можно исправить, повторно инициализировав addedDP для каждой строки:

newMatrix = []

for row in range(0, (len(m1))):
    addedDP = []
    for col in range(0, len(transposedMatrix)):
        addedDP.append(dotProduct(m1[row], transposedMatrix[col]))
        # print("row, col:", row, col, addedDP)
    newMatrix.append(addedDP)
    # print("row", row, addedDP)

return newMatrix

Я оставил в своих отладочных print заявлениях. Я настоятельно рекомендую вам изучить этот основной инструмент отладки: если у вас есть больная программа, спросите , где что-то болит! :-) Смотрите этот прекрасный debug блог для помощи.

Учитывая основную программу:

m1 = [[1, 2],
      [3, 4]]
m2 = [[0, 1],
      [-1, 0]]
print(matrixmult(m1, m2))

Вывод с включенными print инструкциями:

row, col: 0 0 [-2]
row, col: 0 1 [-2, 1]
row 0 [-2, 1]
row, col: 1 0 [-4]
row, col: 1 1 [-4, 3]
row 1 [-4, 3]
[[-2, 1], [-4, 3]]
...