复数¶
复数是可以表示为形式的数字,其中a和b是实数, j称为虚数单位,满足方程。复数在数学和 工程中经常出现,尤其是在信号处理等主题中。传统上,许多用户和库(例如TorchAudio)通过使用形状为的浮点张量来表示数据,其中最后一个 维度包含实部和虚部值。
复数数据类型的张量在处理复数时提供了更自然的用户体验。对复数张量(例如,torch.mv(),torch.matmul())进行的操作可能比使用浮点张量模拟它们的操作更快且内存效率更高。PyTorch 中涉及复数的操作经过优化,以利用向量化汇编指令和专用内核(例如 LAPACK、cuBlas)。
注意
在 torch.fft 模块中的谱操作支持原生复数张量。
警告
复杂张量是一个测试功能,可能会有所更改。
创建复杂张量¶
我们支持两种复数数据类型: torch.cfloat 和 torch.cdouble
>>> x = torch.randn(2,2, dtype=torch.cfloat)
>>> x
tensor([[-0.4621-0.0303j, -0.2438-0.5874j],
[ 0.7706+0.1421j, 1.2110+0.1918j]])
注意
复数张量的默认 dtype 由浮点数的默认 dtype 决定。 如果浮点数的默认 dtype 是 torch.float64,则推断复数具有 torch.complex128 的 dtype;否则假定它们具有 torch.complex64 的 dtype。
除了 torch.linspace(), torch.logspace() 和 torch.arange() 之外的所有工厂函数都支持复数张量。
从旧的表示形式进行转换¶
目前使用实数张量(形状为 )来解决缺少复数张量问题的用户,可以轻松地通过 torch.view_as_complex()
和 torch.view_as_real() 在其代码中切换使用复数张量。请注意,这些函数不会执行任何复制操作,并返回输入张量的一个视图。
>>> x = torch.randn(3, 2)
>>> x
tensor([[ 0.6125, -0.1681],
[-0.3773, 1.3487],
[-0.0861, -0.7981]])
>>> y = torch.view_as_complex(x)
>>> y
tensor([ 0.6125-0.1681j, -0.3773+1.3487j, -0.0861-0.7981j])
>>> torch.view_as_real(y)
tensor([[ 0.6125, -0.1681],
[-0.3773, 1.3487],
[-0.0861, -0.7981]])
访问 real 和 imag¶
可以使用 real 和 imag 来访问复数张量的实部和虚部值。
注意
访问 real 和 imag 属性不会分配任何内存,并且对 real 和 imag 张量的原地更新将更新原始复数张量。此外,返回的 real 和 imag 张量不是连续的。
>>> y.real
tensor([ 0.6125, -0.3773, -0.0861])
>>> y.imag
tensor([-0.1681, 1.3487, -0.7981])
>>> y.real.mul_(2)
tensor([ 1.2250, -0.7546, -0.1722])
>>> y
tensor([ 1.2250-0.1681j, -0.7546+1.3487j, -0.1722-0.7981j])
>>> y.real.stride()
(2,)
角度和绝对值¶
可以使用 torch.angle() 和
torch.abs() 来计算复数张量的角度和绝对值。
>>> x1=torch.tensor([3j, 4+4j])
>>> x1.abs()
tensor([3.0000, 5.6569])
>>> x1.angle()
tensor([1.5708, 0.7854])
线性代数¶
许多线性代数操作,如 torch.matmul(), torch.linalg.svd(), torch.linalg.solve() 等,都支持复数。
如果您希望请求我们目前不支持的操作,请 搜索 是否已有相关问题提交,如果没有,请 提交一个。
序列化¶
复数张量可以被序列化,允许数据以复数值的形式保存。
>>> torch.save(y, 'complex_tensor.pt')
>>> torch.load('complex_tensor.pt')
tensor([ 0.6125-0.1681j, -0.3773+1.3487j, -0.0861-0.7981j])