Python как умножить неквадратные матрицы? - PullRequest
0 голосов
/ 14 января 2020

Предположим, что матрица MxN. Я хочу умножить А с его транспонированием. Можно ли сделать это с помощью чистого вложенного l oop (т.е. без использования np.transpose)? Когда я пытаюсь провести l oop через него, я не знаю, как определить проблему с диапазоном, поскольку форма результата отличается от A.

Скажем, A - 3x4. Тогда результат A * (A ^ T) будет 3x3. Оба значения i, j в result[i][j] не могут быть больше 4. Итак, как я могу выполнять итерации по строкам и столбцам?

Ответы [ 4 ]

1 голос
/ 14 января 2020

Да, это возможно, вы можете попробовать это, если вы хотите полагаться исключительно на вложение.

x = [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]

result = []
for k in range(len(x)):
    temp = []
    for i in range(len(x)):
        tempSum = 0
        for j in range(len(x[0])):
            tempSum += x[k][j]*x[i][j]
        temp.append(tempSum)
    result.append(temp)

print(result)

Выход:

[[14, 38, 62], [38, 126, 214], [62, 214, 366]]

вы можете проверить это с помощью numpy :

>>> x = np.arange(12).reshape(3,4)
>>> x@x.T

array([[ 14,  38,  62],
       [ 38, 126, 214],
       [ 62, 214, 366]])
0 голосов
/ 14 января 2020

Вот решение с использованием списочных представлений и sum:

a = [[1, 2], [3, 4], [5, 6]]

result = [
    [ sum(x*y for x, y in zip(row1, row2)) for row2 in a ]
    for row1 in a
]

# result = [[5, 11, 17], [11, 25, 39], [17, 39, 61]]

. Это работает, потому что каждый элемент в матричном произведении A и Aᵀ является произведением строки из A со столбцом из Aᵀ, а столбцы Aᵀ - это просто строки A.

0 голосов
/ 14 января 2020

Попробуй это. Нет numpy, обычный список и перевод на любой язык

for i in range(len(A)):
    for j in range(len(A)):
        # R must be initialized above with the proper shape (n x n)!
        R[i][j] = 0
        for k in range(len(A[0])):
            R[i][j] += A[i][k] * A[j][k]
0 голосов
/ 14 января 2020

Это вполне возможно при прямом использовании определения умножения матриц и стандартного numpy вещания:

import numpy as np

def matrix_multiplication_nested_loop(A, B):
    res = np.zeros((A.shape[0], B.shape[1]))

    for _x in range(A.shape[0]):
        for _y in range(B.shape[1]):
            res[_x, _y] = np.sum(A[_x, :] * B[:, _y])
    return res

A = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [0, 1, 2, 1]])
B = np.array([[1, 5, 0], [2, 6, 1], [3, 7, 2], [4, 8, 1]]) # A.T
...