NumPy 如何将复数矩阵相乘?

How does NumPy multiply matrices of complex numbers?

我一直在努力找出 NumPy 的复数矩阵乘法背后的算法:

import numpy as np

A = np.array([[17.+0.j, -3.+0.j],
              [-7.+0.j,  1.+0.j]])

B = np.array([[ 60.+0.j,  -4.+0.j],
              [-12.+0.j,   0.+0.j]])

print(A * B)

它输出:

[[1020.+0.j   12.-0.j]
 [  84.-0.j    0.+0.j]]

standard matrix multiplication 的结果非常不同,您可以从下面的数字中看出,所以我想知道 NumPy 到底做了什么:

[[1056.+0.j  -68.+0.j]
 [-432.+0.j   28.+0.j]]

我一直在尝试仅使用 for 循环来重现他们的乘法算法,但我仍然没有找到答案。有什么建议吗?

当您计算 A*B 时,它实际上是按元素乘以矩阵,得到所谓的 hadamard 乘积。这不是马特穆尔。例如 (17.+0.j) * (60.+0.j) = 1020.+0.j,这是输出中的第一个元素。对于矩阵乘法,使用 np.dot 或简单地使用 @ 运算符,即 A@B.

找到了!似乎 NumPy 使用 np.multiply()(逐元素乘法),因此结果不同。

这是使用 for 循环对该函数的简单实现:

def np_multiply(X, Y):
    height = X.shape[0]
    width = X.shape[1]
    output = np.empty((height, width), dtype=np.complex128)

    for i in range(height):
        for j in range(width):
            output[i,j] = X[i, j] * Y[i, j]

    return output

This post 对其性能进行了有趣的讨论。