PyTorch中复数的矩阵乘法

PyTorch中复数的矩阵乘法,pytorch,matrix-multiplication,complex-numbers,Pytorch,Matrix Multiplication,Complex Numbers,我试着在PyTorch中乘以两个复数矩阵 您有什么建议吗?或者有没有其他方法可以在PyTorch中乘法?我使用torch.mv为PyTorch.matmul实现了这个函数,用于复数,目前运行良好: def matmul_complex(t1, t2): m = list(t1.size())[0] n = list(t2.size())[1] t = torch.empty((1,n), dtype=torch.cfloat) t_total = torch.empty((m,n

我试着在PyTorch中乘以两个复数矩阵


您有什么建议吗?或者有没有其他方法可以在PyTorch中乘法?

我使用torch.mv为PyTorch.matmul实现了这个函数,用于复数,目前运行良好:

def matmul_complex(t1, t2):
  m = list(t1.size())[0]
  n = list(t2.size())[1]
  t = torch.empty((1,n), dtype=torch.cfloat)
  t_total = torch.empty((m,n), dtype=torch.cfloat)
  for i in range(0,n):
    if i == 0:
      t_total = torch.mv(t1,t2[:,i])
    else:
      t_total = torch.cat((t_total, torch.mv(t1,t2[:,i])), 0)
  t_final = torch.reshape(t_total, (m,n))
  return t_final

我是PyTorch的新手,如果我错了,请纠正我。

当前
torch。matmul
不支持复杂张量,例如
ComplexFloatTensor
,但您可以执行以下代码:

def matmul_complex(t1,t2):
    return torch.view_as_complex(torch.stack((t1.real @ t2.real - t1.imag @ t2.imag, t1.real @ t2.imag + t1.imag @ t2.real),dim=2))
在可能的情况下,避免使用for循环,因为这将导致更慢的实现。 矢量化是通过使用内置方法实现的,如我随附的代码所示。 例如,您的代码在CPU上大约需要6.1秒,而矢量化版本只需要101ms(大约快60倍),用于两个尺寸为1000 X 1000的随机复杂矩阵

更新: 由于PyTorch 1.7.0(如@EduardoReis所述),您可以在复矩阵之间进行矩阵乘法,类似于实值矩阵,如下所示:

t1@t2

(对于
t1
t2
复数矩阵)。

最近,使用torch
1.8.1+cu101
我能够简单地将两个张量乘以
x*h
,这就产生了它们的复数。@EduardoReis你是对的。由于PyTorch 1.7.0,您可以缩短上面的代码。但是,请注意,
t1*t2
是张量
t1
t2
之间的逐点乘法。您可以使用
t1@t2
来获得与
matmul_复合体
等价的矩阵乘法。我更新了帖子。