#python #arrays #numpy
Вопрос:
Это функция G_channel, которую я написал, которая выдает вывод в виде массива.
import numpy as np
import math
def G_channel(M1,M2,N1,N2,L):
M=M1*M2
N=N1*N2
d=0.5
G=np.zeros((M,N),dtype=complex)
M1index=np.arange(-(N1-1)/2,(M1/2),1)
M2index=np.arange(-(N2-1)/2,(M2/2),1)
N1index=np.arange(-(N1-1)/2,(N1/2),1)
N2index=np.arange(-(N2-1)/2,(N2/2),1)
M1index=M1index.reshape(1,len(M1index))
M2index=M2index.reshape(1,len(M2index))
N1index=N1index.reshape(1,len(N1index))
N2index=N2index.reshape(1,len(N2index))
M1index=M1index.T*(2/M1)
M2index=M2index.T*(2/M2)
N1index=N1index.T*(2/N1)
N2index=N2index.T*(2/N2)
index=np.random.permutation(N)
x=np.ceil(index[0:L]/N2)
x=x.astype(int)
y=index[0:L]-(N2*(x-1))
phi1=[]
for k in range(len(x)):
if(x[k]==16):
x[k]=15
for i in x:
phi1.append(N1index[i])
phi2=[]
for z in range(len(y)):
if(y[z]==16):
y[z]=15
for j in y:
phi2.append(N2index[j])
index=np.random.permutation(M)
x=np.ceil(index[0:L]/M2)
x=x.astype(int)
y=index[0:L]-(M2*(x-1))
psi1=[]
for d in x:
psi1.append(M1index[d])
psi2=[]
for e in y:
psi2.append(M2index[e])
alpha=np.zeros((L,1),dtype=complex)
alpha[0:L] = np.random.normal(loc=0,scale=1,size=(L,1)) 1j*np.random.normal(loc=0,scale=1,size=(L,1)) / math.sqrt(2) #gaussian distribution
for l in range(L):
a1=(1/math.sqrt(N1))*np.exp((-1j)*2*np.pi*(np.arange(0,N1,1).reshape(N1,1))*d*phi1[l])
a2=(1/math.sqrt(N2))*np.exp((-1j)*2*np.pi*(np.arange(0,N2,1).reshape(N2,1))*d*phi2[l])
a=np.kron(a1,a2)
b1=(1/math.sqrt(M1))*np.exp((-1j)*2*np.pi*(np.arange(0,M1,1).reshape(M1,1))*d*psi1[l])
b2=(1/math.sqrt(M2))*np.exp((-1j)*2*np.pi*(np.arange(0,M2,1).reshape(M2,1))*d*psi1[1])
b=np.kron(b1,b2)
G = G alpha[l]*np.matmul(b,a.T)
G = np.sqrt((M*N)/L)*G
return G
Это созданная функция hr_channel, которая также выводит массив в ответе
import numpy as np
import math
def hr_channel(N1,N2,K,Lc,L):
N=N1*N2
d=0.5
hK=np.zeros((N,K),dtype=complex)
N1index=np.arange(-(N1-1)/2,(N1/2),1)
N1index=N1index.reshape(len(N1index),1)*(2/N1)
N2index=np.arange(-(N2-1)/2,(N2/2),1)
N2index=N2index.reshape(len(N2index),1)*(2/N2)
index=np.random.permutation(N)
x=np.ceil(index[0:Lc]/N2)
x=x.astype(int)
y=index[0:Lc]-(N2*(x-1))
for i in range(len(x)):
if(x[i]==16):
x[i]=15
phi1c=[]
for i in x:
phi1c.append(N1index[i])
for i in range(len(y)):
if(y[i]==16):
y[i]=15
phi2c=np.array([])
for j in y:
phi2c=np.append(phi2c,N2index[j])
for k in range(K):
alpha=np.zeros((L,1),dtype=complex)
alpha[0:L] = np.random.normal(loc=0,scale=1,size=(L,1)) 1j*np.random.normal(loc=0,scale=1,size=(L,1)) / np.sqrt(2)
hr=np.zeros((N,1),dtype=int)
phi1=phi1c[0:Lc]
phi2=phi2c[0:Lc]
index=np.random.permutation(N)
x=np.ceil(index[0:L-Lc]/N2)
x=x.astype(int)
y=index[0:L-Lc]-(N2*(x-1))
for i,j in zip(range(Lc,L),x):
phi1[i]=N1index[j]
for k,m in zip(range(Lc,L),y):
phi2[k]=N2index[y]
for l in range(L):
a1=(1/math.sqrt(N1))*np.exp((-1j)*2*np.pi*(np.arange(0,N1,1).reshape(N1,1))*d*phi1[l])
a2=(1/math.sqrt(N2))*np.exp((-1j)*2*np.pi*(np.arange(0,N2,1).reshape(N2,1))*d*phi2[l])
a=np.kron(a1,a2)
hr= hr alpha[l]*a
hK[:,[k]]=math.sqrt(N/L)*hr
return hK
Основной файл, который использует выходные данные из G_channel и hr_channel, передавая в него значения. Ошибка, которую я получаю, генерируется в последней строке, которую можно проверить, если вы также запустите эти три кода.
Либо я получаю ошибку как np.linalg.обратная, либо ошибку значения.
from sys import path_hooks
import numpy as np
import math
from numpy.core.defchararray import index
from gchannel import *
from hrchannel import *
M1=8
M2=8
N1=16
N2=16
M=M1*M2
N=N1*N2
K=16
L1=5
L2=8
L2c1=0
L2c2=4
L2c3=6
L2c4=8
Q_all=np.arange(32,144,16)
d=0.5
C0 = 0.001
d1 = 10
d2 = 100
alpha1 = -2.2
alpha2 = -2.8
p1=C0*pow(d1,alpha1)
p2=C0*pow(d2,alpha2)
UN1=(1/math.sqrt(N1))*np.exp((-1j)*2*np.pi*(np.arange(0,N1,1).reshape(N1,1))*d*np.arange(-(N1-1)/2,(N1/2),1)*(2/N1))
UN2=(1/math.sqrt(N2))*np.exp((-1j)*2*np.pi*(np.arange(0,N2,1).reshape(N2,1))*d*np.arange(-(N2-1)/2,(N2/2),1)*(2/N2))
UN=np.kron(UN1,UN2)
UM1=(1/math.sqrt(M1))*np.exp((-1j)*2*np.pi*(np.arange(0,M1,1).reshape(M1,1))*d*np.arange(-(M1-1)/2,(M1/2),1)*(2/M1))
UM2=(1/math.sqrt(M2))*np.exp((-1j)*2*np.pi*(np.arange(0,M2,1).reshape(M2,1))*d*np.arange(-(M2-1)/2,(M2/2),1)*(2/M2))
UM=np.kron(UM1,UM2)
SNR_dB=0
SNR_linear=10**(SNR_dB/10)
sample=200
length=len(Q_all)
error0=np.zeros((sample,length),dtype=complex)
error1=np.zeros((sample,length),dtype=complex)
error2=np.zeros((sample,length),dtype=complex)
error3=np.zeros((sample,length),dtype=complex)
error4=np.zeros((sample,length),dtype=complex)
error5=np.zeros((sample,length),dtype=complex)
error6=np.zeros((sample,length),dtype=complex)
energy=np.zeros((sample,1),dtype=complex)
for s in range(1,sample):
sigma2=(p1*p2)/(SNR_linear)
G=math.sqrt(p1)*G_channel(M1,M2,N1,N2,L1)
hK=math.sqrt(p2)*hr_channel(N1,N2,K,L2,L2)
H=np.zeros((K,N,M),dtype=complex)
for k in range(K):
hr=hK[:,k]
HC=np.matmul(G,np.diag(hr))
um1=np.matmul(UM.T,HC)
un1=np.matmul(um1,UN.T)
H[k,:,:]=un1.T
for iQ in range(length):
Q=Q_all[iQ]
Y=np.zeros((K,Q,M),dtype=complex)
W=((np.random.rand(N,Q)>0.5)*2-1)/math.sqrt(N)
A=(np.matmul(UN,W)).T
for k in range(K):
noise = math.sqrt(sigma2)*(np.random.randn(Q,M) 1j*np.random.randn(Q,M))/math.sqrt(2)
Y[k,:,:]=np.dot(A,H[k,:,:]) noise
Hhat=np.zeros((K,N,M),dtype=complex)
T=np.size(A,0)
e=0
for k in range(K):
YK = Y[k,:,:]
e = e np.sum(np.square(np.abs(YK)),axis=0)
index=e.argsort()[::-1]
column=index[0:L1]
Full_Supports = np.zeros((K,L1,L2),dtype=complex)
for c in range(L1):
Yc=Y[:,:,column[c]]
Yc=np.reshape(Yc,(T,K))
Rc=Yc
rowc=[]
Hchat=np.zeros((N,K),dtype=complex)
for k in range(K):
k
yc=Yc[:,k]
rc=Rc[:,k]
row=rowc
for r in range(L2-L2c1):
e=np.absolute(np.matmul(A.T,rc))
e=np.square(e)
index=np.argmax(e)
row.append(index)
Phi_s=A[:,row]
hchat=np.zeros((N,1),dtype=complex)
hchat[row,:]=np.matmul(np.matmul(np.linalg.inv(np.matmul(Phi_s.T,Phi_s)),Phi_s.T),yc)
Комментарии:
1. В какой строке возникает ошибка?
2. Есть ли еще что-то в ошибке, например, трассировка стека? (В вашем названии есть орфографическая ошибка, которая заставляет меня задуматься, не скопировали ли вы вставили его).
3. Последняя строка, в которой мы вычисляем обратную матрицу, дает мне ошибку, которая указывает на ошибку сингулярной матрицы linalg. Пожалуйста, помогите