дурачок,линалг.Ошибка LinAlgError: Сингулярная матрица или форма ошибки значения не могут передавать (2,) с помощью (2,1)

#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. Пожалуйста, помогите