torch tensor复数运算

torch tensor是不支持复数运算的,但有的时候场景中使用的是复数信号,复数计算就是把复数(n*1)的复数变成两列(n*2),下面是把numpy代码改写成torch tensor的示例:

import numpy as np
import torch 

1.numpy与torch类型转换

np_data=np.arange(6).reshape(2,3)

# numpy类型转torch
torch_data=torch.from_numpy(np_data)

#torch转回numpy
tensor2array=torch_data.numpy()

2.矩阵合并

#numpy使用
np.concatenate((w1, w2))
#torch使用
torch.cat((w1, w2))

3.傅里叶变换fft/反变换ifft,tensor类型的SigIn大小为(n,2),输出的sigFFT大小也是(n,2),表示数的实部和虚部

#numpy使用
SigFFT = np.fft.fft(SigIn)
SigOut=np.fft.ifft(SigFFT )
#torch使用
SigIn=torch.rand(1000,2)
SigFFT = torch.fft(SigIn,1)
SigOut=torch.ifft(SigFFT,1)

4.我写的运算函数,输入都是(n,2)shape的tensor

def complexExp(x):
    #x是两列的tensor,利用欧拉公式计算
    x1=torch.exp(x[:,0])*torch.cos(x[:,1])
    y1=torch.unsqueeze(x1, 1)
    x2=torch.exp(x[:,0])*torch.sin(x[:,1])
    y2=torch.unsqueeze(x2, 1)
    y=torch.cat((y1,y2),1)
    return y

#复数乘法
def complexMulti(a,b):
    c1=a[:,0]*b[:,0]-a[:,1]*b[:,1]
    c1=torch.unsqueeze(c1, 1)
    c2=a[:,0]*b[:,1]+a[:,1]*b[:,0]
    c2=torch.unsqueeze(c2, 1)
    c=torch.cat((c1,c2),1)
return c

#复数abs
def complexAbs(x):
    y=torch.norm(x,dim=1)
    y=torch.unsqueeze(y,1)
    return y

5.exp(1j*x)  x是大小为(n,)的tensor

def dim1to2(x,mode='real'):
    '''
    把(n,1) (n,2) (n)的数都变成(n,2)的shape
    
    (n,1)和(n,)的可以选择放在实部还是虚部

    Parameters
    ----------
    x : TYPE
        DESCRIPTION.
    mode : 'real' and 'imag'The default is 'real'.
    如果是'imag'的一维信号的话,值赋给虚部

    Returns
    -------
    temp : (n,2)

    '''
    temp=torch.zeros(x.shape[0],2)
    if x.dim()==1:
        if mode=='real':
            temp[:,0]=x
        elif mode=='imag':
            temp[:,1]=x
    elif x.dim()==2:
        if x.shape[1]==1:
            if mode=='real':
                temp[:,0]=x.reshape(-1)
            elif mode=='imag':
                temp[:,1]=x.reshape(-1)
        elif x.shape[1]==2:
            temp=x
    return temp

#x (n,)  exp(1j*x)
y=complexExp(dim1to2(x,'imag'))

你可能感兴趣的:(pytorch,python)