Python非方矩阵如何相乘?

Python how to multiply non square matrices?

假设A是一个MxN矩阵。我想将 A 与其转置相乘。是否可以使用纯嵌套循环(即不使用 np.transpose)来实现?当我尝试遍历它时,我不知道如何找出范围问题,因为结果的形状与 A 不同。

假设 A 是 3x4。那么 A*(A^T) 的结果将是 3x3。 i, j in result[i][j] 都不能大于4,那么如何按行和列迭代呢?

是的,可以,如果你想纯粹依赖嵌套,可以试试这个

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

通过直接使用矩阵乘法定义和标准 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

试试这个。没有 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]

这是一个使用列表推导和 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的行。